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
属性:我怀疑这不会像您期望的那样工作,即使线程问题已解决。
我想在文件更改时更新我的 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
属性:我怀疑这不会像您期望的那样工作,即使线程问题已解决。