我正在编写一个应用程序,它将显示摄像机看到的当前图像,它需要实时更新显示的图像,或者接近它。基本上,我有一个相机,我可以捕捉图像,我需要每隔一秒捕获一个,然后将该图像显示在屏幕上。目前,我的应用程序有一个Image控件,我从相机捕获一个BitmapImage并将其设置为Image.Source。我的麻烦是让这个不断更新。不幸的是,我没有处理类似这样的东西的经验,这些东西必须永远更新(或者直到我正在编写的应用程序关闭)并且说实话,似乎很少甚至没有(我已经能够发现)关于在WPF / C#中做这样的事情的网络。我怀疑我必须生成一个线程来执行图像捕获,但说实话,这是我的问题的一部分 - 我对使用线程的经验很少,并且对于如何工作有点困惑。非常感谢您提供的任何帮助。
答案 0 :(得分: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}}"
这应该使绑定正常工作。在单独的线程上执行操作需要调度程序
答案 1 :(得分:0)
您应该阅读WPF中的数据绑定。一旦绑定数据项发生更改,WPF就会充满观察者模式以更新显示。您正在更改Image.Source而不是更改图像内容的事实可能是令人困惑的事情。您需要在XAML中将图像控件设置为数据绑定到位图对象(可能是表单的字段),然后根据需要更改或重新加载位图对象。数据绑定图像控件应在每次更改位图对象时自动重绘。
由于您提到了后台线程,因此您需要注意仅在UI线程上修改UI元素(Image,Bitmap)的属性。如果您在后台线程中收到新图像并希望在UI中显示它,则需要将该更新同步到UI线程。请参阅Dispatcher。调用()
答案 2 :(得分:0)
我处于类似的情况,除了Image通过WCF传递给我的WPF客户端。所以我设置了一个计时器并每隔1秒调用一次WCf服务。但是当我将ImageSource分配给bitmapImage时,图像会闪烁,就像我得到一个白色的屏幕,图像,白色屏幕,图像 如何使它连续?