我想在文件更改时更新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按预期工作。
答案 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
属性:我怀疑即使解决了线程问题,也无法实现预期效果。