你好我是新来的,以前是比较被动的读者。我正在学习 WPF + MVVM,我认为我在整个绑定概念中遗漏了一些东西。我将 flycapture2 SDK 用于点灰色相机,根据附加的示例,我应该在图像接收事件上调用 _ProgressChanged 并将接收到的图像绑定到 image.source 属性
private void m_worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
BitmapSource image = (BitmapSource)e.UserState;
this.Dispatcher.Invoke(DispatcherPriority.Render,
(ThreadStart)delegate ()
{
image.Source = image;
}
);
}
但这对我来说并不好,因为每次新图像到达时我们都会覆盖源图像。
我尝试做的(遵循一些在线教程)是通过 ViewModel 属性 Images_s 将 Image 控件源属性与后面的窗口代码绑定(将 DataContext 设置为 ViewModel),然后我希望每次更改 viewModel.Images_s 它应该更新用户界面。不幸的是,这不起作用,而是我得到了一个空窗口。
另外 - 我需要分派这个任务吗?正如我想象的那样,绑定应该在窗口代码中的图像变量更改事件时更新 UI 本身(或者我是否高估了 WPF 的超能力?)谢谢,
<Image Name="myImage" Source="{Binding Image_s}" Stretch="UniformToFill"/>
视图模型:
public class ViewModel : INotifyPropertyChanged
{
private BitmapSource img;
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
public BitmapSource Image_s
{
get { return this.img; }
set
{
this.img = value;
this.NotifyPropertyChanged("Image_s");
}
}
窗口代码:
viewModel = new ViewModel();
this.DataContext = viewModel;
视图模型:
private void m_worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
BitmapSource image = (BitmapSource)e.UserState;
this.Dispatcher.Invoke(DispatcherPriority.Render,
(ThreadStart)delegate ()
{
viewModel.Image_s = image;
}
);
}