ImageTools and Webclient

本文关键字:Webclient and ImageTools | 更新日期: 2023-09-27 18:16:53

我试图使用webclient检查下载流之前,它是由ExtendedImage处理,因为我的应用程序显示一个错误,当uri没有找到。

所以我的解决方案是首先加载图像,然后将web客户端结果读取到扩展图像中。

这就是我要做的。

WebClient wc = new WebClient();
wc.OpenReadAsync(Uri);
wc.OpenReadCompleted += delegate(object Sender, OpenReadCompletedEventArgs e){
        Logo = new BitmapImage();
        ExtendedImage hExtendedImage = new ExtendedImage();
        try
        {
                hExtendedImage.SetSource(e.Result);
                Logo.SetSource(hExtendedImage.ToStream());
        }
        catch (WebException)
        {
        }
};

但现在我从hExtendedImage得到一个"图像未加载"错误在这行

Logo.SetSource(hExtendedImage.ToStream());

我显然是从e.Result加载图像到hExtendedImage错误。

ImageTools and Webclient

var client = new WebClient();
// Always define event handlers, 
// BEFORE calling any method that could invoke them.
client.OpenReadCompleted += (s1, e1)
{
    Logo = new BitmapImage();
    var extendedImage = new ExtendedImage();
    extendedImage.OnLoadingCompleted += (s2, e2)
    {
        // Invoke the dispatcher, so we're sure it's set on the UI thread.
        Dispatcher.BeginInvoke(new Action
        (
            () => Logo.SetSource(extendedImage.ToStream()))
        );
    };
    extendedImage.SetSource(e1.Result);
};
client.OpenReadAsync(Uri);

不幸的是,SetSource是async。使用hExtendedImage的LoadingCompleted事件来设置Logo源。小心: LoadingCompleted回调不在ui线程中!如果你想改变UI控件,比如Image.

,你必须调用dispatcher。

从ExtendedBitmap源代码在CodePlex:

 public void SetSource(Stream stream)
        {
            Contract.Requires<ArgumentNullException>(stream != null, "Stream cannot be null.");
            if (_uriSource == null)
            {
                LoadAsync(stream);
            }
        }