WPF FileWatcher 更新 Image.Source 线程冲突

WPF FileWatcher update Image.Source Thread Conflict

我想在文件更改时更新我的​​ wpf 中的图像。我的问题是我收到一条错误消息,提示 Image 对象属于其他线程,因此我无法编辑 Image.Source。我希望图像在 filewatcher 事件触发时发生变化。我应该怎么做?

我有这样的东西:

C# 类 1:

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 按预期工作。

您的 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 或其他任何东西上)代表图像源,并从您的 [= 绑定到那个 属性 33=]。那么无论您是从后台线程还是从 UI 线程更改 属性 都没有关系。

可能值得为您的 BufferedImage class 发布源代码。目前您正在尝试将 BufferedImage 的实例分配给 Image.Source 属性:我怀疑这不会像您期望的那样工作,即使线程问题已解决。