ImageTools和Webclient

时间:2011-12-05 14:59:24

标签: c# silverlight windows-phone-7

我正在尝试使用webclient检查下载流,然后由ExtendedImage处理,因为我的应用程序在找不到uri时显示错误。

所以我的解决方案是首先加载图像,然后将webclient结果读入扩展图像。

这就是我想要做的。

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错误。

2 个答案:

答案 0 :(得分:0)

不幸的是,SetSource是ansyc。使用hExtendedImage的事件LoadingCompleted来设置徽标源。 小心: LoadingCompleted回调不在ui线程中!如果要更改像Image这样的UI控件,则必须调用调度程序。

来自CodePlex上的ExtendedBitmap源:

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

            if (_uriSource == null)
            {
                LoadAsync(stream);
            }
        }

答案 1 :(得分:0)

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);