我正在编写一个应用程序,它将显示相机看到的当前图像,它需要实时更新显示的图像,或者接近它。从本质上讲,我有一台可以捕捉图像的相机,我需要每隔 1 秒捕捉一个图像并将该图像显示到屏幕上。目前,我的应用程序有一个 Image 控件,我正在从相机捕获一个 BitmapImage 并将其设置为 Image.Source。我的麻烦是让它不断更新。不幸的是,我没有处理这样的事情的经验,它必须永远更新自己(或者直到我正在编写的应用程序关闭),老实说,似乎很少甚至没有(我已经能够发掘)在web 关于在 WPF/C# 中做这样的事情。我怀疑我 必须生成一个线程来执行图像捕获,但老实说,这是我的问题的一部分——我很少有使用线程的经验,而且对所有这些工作的原理有点困惑。非常感谢您提供的任何帮助。
3 回答
要使数据绑定正确更新,您可以使用INotifyPropertyChanged。只需添加对 System.ComponentModel 的引用:
using System.ComponentModel;
然后继承接口:
MyWindow : INotifyPropertyChanged
然后添加以下代码:
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
最后,添加要绑定的属性。
private BitmapImage currentImage;
public BitmapImage CurrentImage{get{return currentImage;} set{currentImage=value;NotifyPropertyChanged("CurrentImage");}}
最后,在您的 xaml 中,将绑定更改为 {Binding CurrentImage} 然后对于窗口,将数据上下文设置为相对源自身...这将是窗口的属性:
DataContext="{Binding RelativeSource={RelativeSource Self}}"
这应该使绑定正常工作。在单独的线程上做事需要调度程序
您应该阅读 WPF 中的数据绑定。WPF 充满了观察者模式,一旦绑定的数据项发生更改,就会更新显示。您正在更改 Image.Source 而不是更改图像内容的事实可能是令人困惑的事情。您需要将 XAML 中的图像控件设置为数据绑定到位图对象(可能是表单的字段),然后根据需要更改或重新加载位图对象。数据绑定图像控件应在每次更改位图对象时自动重绘自身。
由于您提到了后台线程,因此您需要注意仅在 UI 线程上修改 UI 元素(Image、Bitmap)的属性。如果您在后台线程中收到新图像并希望在 UI 中显示它,则需要将该更新同步到 UI 线程。请参阅调度程序 .Invoke()
我处于类似的情况,除了图像通过 WCF 传递给我的 WPF 客户端。所以我设置了一个计时器并每隔1秒调用一次WCf服务。但是当我将 ImageSource 分配给 bitmapImage 时,图像会闪烁,就像我得到一个白屏一样,Image, whit screen, image 如何让它连续?