2009-12-03 16 views
0

我有一套用于下载图片的Image元素。所有图片都必须下载,但我希望首先下载用户正在查看的图片。如果用户更改所查看的图片,我希望取消正在进行的下载以尽可能快地获取所查看的图片。正确取消Silverlight中的图像下载

要开始下载我写:myImage.Source = new BitmapImage(theUri);

我应该如何取消它?

  • myImage.Source = null;
  • 作用于BitmapImage?
  • 更好的解决方案?

我不希望通过代码下载图片以保持浏览器缓存的优势。

+0

为什么你认为使用代码会失去浏览器缓存的好处? – AnthonyWJones 2009-12-03 18:28:48

+0

“通过代码下载”我的意思是使用web服务下载图片字节并将其分配给图像元素。这可能是另一个问题的主题,但是,通过保留浏览器缓存,您将使用什么技术来控制下载请求? – Mart 2009-12-03 22:11:06

回答

1

这绝对是可行的 - 我只是测试它来确保。这里是一个快速类,你可以尝试:

public partial class Page : UserControl 
{ 
    private WebClient m_oWC; 
    public Page() 
    { 
     InitializeComponent(); 
     m_oWC = new WebClient(); 
     m_oWC.OpenReadCompleted += new OpenReadCompletedEventHandler(m_oWC_OpenReadCompleted); 
    } 

    void StartDownload(string sImageURL) 
    { 
     if (m_oWC.IsBusy) 
     { 
      m_oWC.CancelAsync(); 
     } 
     m_oWC.OpenReadAsync(new Uri(sImageURL)); 
    } 

    void m_oWC_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
    { 
     BitmapImage oBMI = new BitmapImage(); 
     oBMI.SetSource(e.Result); 
     imgMain.Source = oBMI; 
    } 
} 

这个工作就像你希望(我测试)。每当您使用图像的URL(大概每当用户点击下一张图像时)调用StartDownload时,如果当前下载正在进行,它将被取消。 Broswer缓存也一定会被使用(我用提琴手验证过),所以缓存的图像会立即被加载。

+0

我不知道WebClient类实际上是对浏览器下载功能的访问。即使我需要一些时间来适应我们的项目,我现在也信任你并确认答案。谢谢。 – Mart 2009-12-07 10:12:42