c# - 在 wpf/surface 中从网络加载图像

标签 c# wpf multithreading mvvm-light pixelsense

我正在尝试在我的 wpf 应用程序中从 Web 加载图像。

思路如下: 当我点击一个按钮时,会出现一个带有附加信息的弹出窗口。在这个弹出窗口中,我使用了一些来自网络的图片。

问题: 加载弹出窗口时,系统会在等待图像时挂起。我有约束力 我的代码后面的图像。图像存储在 ObservableCollection 中。我试过了 使用一个线程来加载图像,但每次我遇到一个异常,说该线程不是对象的所有者。

我尝试使用 Invoke 将下载的图像获取到 UserinterfaceThread,但我无法访问它。我的代码如下:

        IList<Image> imagesFromWeb = downloadImagesFromWeb(url);


        DispatcherHelper.UIDispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate()
        {
            foreach (Image img in imagesFromWeb 
            {
                this.ObservableCollection_Images.Add(img);
            }
    }

一旦下载了图像并尝试将图像添加到(已经打开的)弹出窗口中,我得到异常提示线程 不是对象的所有者

有人可以指出我正确的方向吗?

最佳答案

如果您在可以使用普通 HTTP URI 寻址的公共(public) Web 服务器上有可用的图像,那么您可以直接将源设置为该图像:

<Image Source="http://www.someserver.com/myimage.png" />

WPF 会负责下载它——我认为它甚至会异步执行,尽管我不是 100% 确定。

您当然也可以使用数据绑定(bind)来做到这一点:

<Image Source="{Binding TheImage}" />

在 View 模型中

public string TheImage 
{ 
    get { return "http://www.someserver.com/myimage.png"; } 
}    

关于c# - 在 wpf/surface 中从网络加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4223218/

相关文章:

c# - 将委托(delegate)用法从 C# 转换为 VB

c# - 如何在循环中添加同名节点?

java - 关闭第三个应用程序线程而不等待其完成的首选方法是什么?

java - HTMLUNIT v. 2.15 Bug 线程死锁

java - Java 中的死锁(附示例)

c# - WPF DataGrid Cell 不离开编辑模式

c# - 2个日期之间的XPath表达式

wpf - 访问现有的 WPF 应用程序实例?

c# - WPF 使用数据网格删除所选项目

c# - WPF MVVM textBox 文本绑定(bind)