WPF FileWatcher更新Image.Source线程冲突

时间:2015-01-26 00:16:21

标签: c# wpf multithreading xaml

我想在文件更改时更新wpf中的图像。我的问题是我收到一个错误,说Image对象属于其他线程,所以我无法编辑Image.Source。我希望在filewatcher事件触发时更改图像。我该怎么做?

我有这样的事情:

C#Class1:

void fileWatcher_Changed(object sender, FileSystemEventArgs e)
{
    uiClass.UpdateImage(new BufferedImage(Path))
} 

.xaml WPF uiClass:

 Image x:Name="Image" 

.cs WPF uiClass:

public void UpdateImage(BufferedImage img) 
{ 
    this.Image.Source = img; 
}

注释:fileSystemWatcher按预期工作。

1 个答案:

答案 0 :(得分:0)

您的FileWatcher事件(fileWatcher_Changed)会在后台线程上触发,您尝试更新图片的Source属性(通过调用UpdateImage )。这失败并出现错误,因为(简单来说)Image控件只能从UI线程更新。

正如@aloisdg在评论中所述,您可以使用调度程序的BeginInvoke方法将工作从后台线程转移到UI线程:

public void UpdateImage(BufferedImage img) 
{ 
    Action updateImage = () => { this.Image.Source = img };
    Dispatcher.BeginInvoke(updateImage);
}

另一种方法是拥有代表图像源的属性(在Window或ViewModel或其他)上,并从XAML绑定到该属性。然后,从后台线程或UI线程更改该属性无关紧要。

可能值得发布BufferedImage课程的源代码。目前,您正尝试将BufferedImage的实例分配给Image.Source属性:我怀疑即使解决了线程问题,也无法实现预期效果。