【问题标题】:WPF FileWatcher update Image.Source Thread ConflictWPF FileWatcher 更新 Image.Source 线程冲突
【发布时间】:2015-01-26 00:16:21
【问题描述】:

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

我有这样的事情:

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

【问题讨论】:

  • Dispatcher.BeginInvoke() ?

标签: c# wpf multithreading xaml


【解决方案1】:

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

正如 cmets 中的 @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 属性:我怀疑即使线程问题得到解决,这也不会像您期望的那样工作。

【讨论】:

  • 完美运行!非常感谢您清晰而认真的回答! :D 你为我节省了很多时间,而且你的答案很容易掌握! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 2019-01-12
  • 2011-04-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多