如何从异步图像查找结果中提取finalUri属性?

时间:2011-08-04 00:43:28

标签: windows-phone-7

在Windows Phone 7中,我正在进行简单的异步查找以通过uri查找图像,并将返回的二进制文件设置为图像控件的源。

public object SetImageFromUri(string uri)
{
    var wc = new WebClient();
    wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
    wc.OpenReadAsync(new Uri(uri), wc);

    return null;
}

void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
    if (e.Error == null && !e.Cancelled)
    {
            var image = new BitmapImage();
            image.SetSource(e.Result);

            //e.Result has a property in the memory stream labeled finalUri
            //someImageControl.Source = image;

    }
}

我的问题是 - 如何从e.Result中取出最终的uri属性,以便我可以看到它与之相关的图像控制

提前谢谢

3 个答案:

答案 0 :(得分:2)

不是将WebClient作为第二个参数传递,而是传递Uri(或其他一些usefule状态信息)

wc.OpenReadAsync(new Uri(uri), uri);

然后,您可以在回调中访问此内容

var uri = (string)e.UserState;

答案 1 :(得分:1)

由于Reflection机制中实现了特定限制,您无法从沙盒代码访问内部内容。最终,你会想要使用这样的东西:

FieldInfo f = e.Result.GetType().GetField("_finalUri", BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.Instance);
Uri n = (Uri)f.GetValue(e.Result);

但是,这会导致FieldAccessException。如果您没有使用重定向URI,那么您可以简单地重用最初传递给您的方法的参数。如果没有,您需要检查HttpWebRequest并遵循idea I outlined a couple of days ago

答案 2 :(得分:1)

您也可以直接绑定到Image,并使用LowProfileImageLoader,以避免在加载期间阻止UI线程。 (请记住设置FallBack图像)