2011-07-04 64 views
4

在我的MainPage中,我添加了许多图像,每个图像都是通过制作HttpWebRequest从服务器检索的。在MainPage上还有一些链接,单击这些链接可将用户带到新页面。如何检查图像是否在导航堆栈中加载时加载

我面对的问题是,在所有图像加载到MainPage本身之前,如果我点击MainPage上的任何链接,将创建并显示一个新页面,并且所有挂起的图像请求都被取消。现在,如果通过单击后退按钮返回到MainPage,卸载的图像仍保持卸载状态。

我不知道如何检查图像是否已经加载或没有,当我回到导航堆栈中的MainPage(如果我能够发现一些图像没有加载,我可以请求服务器再次为卸载的图像)。我需要一个通用的解决方案。因为MainPage内容布局中的父子关系是动态的,意味着我不知道Image控件的层次结构,所以Image控件可以是一个画布的子项,该画布依次添加到MainPage的内容网格或图像可以添加到一个全景/枢轴继而加入的MainPage的内容的网格,等的部分中,....

+0

我如何知道卸载的图像得到了重点。当用户导航回导航历史记录时,是否需要遍历当前页面内容的所有子项?如果是,则所有控件中都没有儿童财产。例如,如果我的当前页面包含画布或网格或堆栈面板,则可以遍历它们的所有子项。但如果它是一幅全景图或主题图,我将如何循环浏览它们的所有孩子。没有儿童财产可用于这些控件。 – saikamesh

+0

你能看到你所看到的repro吗?我不明白你在做什么,导致我认为你在描述的内容。 –

回答

2
+0

我如何知道卸载的图像已获得重点。当用户导航回导航历史记录时,是否需要遍历当前页面内容的所有子项?如果是,则所有控件中都没有儿童财产。例如,如果我的当前页面包含画布或网格或堆栈面板,则可以遍历它们的所有子项。但如果它是一幅全景图或主题图,我将如何循环浏览它们的所有孩子。没有儿童财产可用于这些控件。 – saikamesh

+0

这与原始问题无关......但是,您在两者上都有Items属性。不知道这会怎样帮助你。 – argh

1
  1. 作为argh建议使用ImageOpened事件(也可能是ImageFailed)来跟踪图像是否已成功加载。您可以创建一个包含Image的包装控件(无法继承,因为它是密封的)来监视事件并实现您自己的IsLoaded属性。
  2. 您可以使用VisualTreeHelper.GetParent向上遍历树,并查看Image控件是否是MainPage的后代,以查找问题的第二部分。

这应该工作,但是,我想知道为什么当您按下后退按钮图像不重新加载。我不认为任何建议的'黑客'应该是必要的。你是否使用任何自定义逻辑进行图像加载等?

0

您可以检查图像温度名称。因为在我的项目中我使用图像临时显示图像加载到服务器之前。

您可以查看当前名称的形象,如果是类似于临时图像名称,然后继续下跌,他们将不下来 我的代码:

if(((BitmapImage)img.Source).UriSource.Equals("/NhomMua;component/Image/img_temp_sale.png")) 
         { 
          //code of you 
         } 
0

我建议你看看LowProfileImageLoader http://blogs.msdn.com/b/delay/archive/2010/09/02/keep-a-low-profile-lowprofileimageloader-helps-the-windows-phone-7-ui-thread-stay-responsive-by-loading-images-in-the-background.aspx)作为以有效方式处理图像加载的通用方式。如果您特别需要能够取消并恢复加载图像,您应该可以修改该代码以便轻松处理 - 尽管我不确定您为什么要这么做,但请记住它更有效地使用电池下载所有的图像在一个命中而不是停止和开始。