2010-08-03 27 views
0

我正在編寫一個應用程序,它將顯示攝像機看到的當前圖像,並且需要實時或接近地更新顯示的圖像。基本上,我有一臺可以捕捉圖像的相機,我需要每隔1秒捕捉一個圖像並將該圖像顯示在屏幕上。目前,我的應用程序有一個Image控件,我從相機捕獲一個BitmapImage並將其設置爲Image.Source。我的麻煩是讓這個不斷更新。不幸的是,我沒有經驗來處理類似這樣的事情,它必須永遠更新自己(或者直到我正在寫的應用程序關閉),並且誠實地說,對於這些事情似乎沒有什麼(我已經能夠發現)網絡關於在WPF/C#中做這樣的事情。我懷疑我必須產生一個線程來執行圖像捕獲,但老實說,這是我的問題的一部分 - 我很少有與線程一起工作的經驗,並且對所有這些工作有些困惑。非常感謝您提供的任何幫助。在「實時」更新WPF控件

回答

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,更改綁定到{結合CurrentImage},然後在窗口中,設置爲相對源自身的數據上下文...這將是窗口的屬性:

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

這應該使綁定正常工作。在單獨的線程上執行操作需要調度程序

+0

將這個答案與dthorpe的下面的作品完美結合!非常感謝你使這個非常清晰和防僞。非常感謝。 – JToland 2010-08-05 17:35:38

0

您應該閱讀WPF中的數據綁定。一旦綁定的數據項發生改變,WPF就會充滿觀察者模式以更新顯示。事實上,你正在改變Image.Source而不是改變圖像的內容可能是令人困惑的事情。您需要將XAML中的圖像控件設置爲數據綁定到位圖對象(可能是您的表單的一個字段),然後根據需要更改或重新加載位圖對象。數據綁定的圖像控件應該在每次更改位圖對象時自動重繪。

由於您提到了後臺線程,因此您需要小心修改UI元素(圖像,位圖)的屬性,僅在UI線程上。如果您在後臺線程中收到新圖像並想在UI中顯示它,則需要將該更新同步到UI線程。請參閱Dispatcher。調用()

+0

因爲它是WPF,所以使用[Dispatcher](http://msdn.microsoft.com/en-us/magazine/cc163328.aspx)是用於與UI線程同步的WPF方式。 – 2010-08-03 18:24:06

+0

也許我沒有正確理解這個... Image控件沒有Content屬性,所以我將Source綁定到了表單的Property。我嘗試過: 但是,問題是,當我以後編程設置this.CurrentImage時,它從不更新Image控件-I只是得到一個空白的圖像。我做錯了什麼嗎?此外,所以要更新圖像每秒(或一段時間),你是否建議使用後臺線程來改變形式CurrentImage屬性或別的東西?再次感謝! – JToland 2010-08-03 18:29:11

+0

@JToland:如果你綁定到你實現的屬性,你還需要在包含該屬性的類上實現INotifyPropertyChanged,以便數據綁定機制可以發現該屬性已經改變並作出相應的響應。在你的例子中,這將是表單類。請參閱MSDN上的示例實現:http://msdn.microsoft.com/en-us/library/ms229614.aspx – dthorpe 2010-08-03 19:41:50

0

我處於類似的情況,除了Image通過WCF傳遞給我的WPF客戶端。所以我設置了一個計時器並每隔1秒呼叫一次WCf服務。但是,當我將ImageSource分配給bitmapImage時,圖像閃爍,正如我獲得白色屏幕,圖像,白色屏幕,圖像 如何使其連續?

+0

您是否嘗試過使用上面討論的方法?我知道什麼時候我的CurrentImage屬性發生了變化,以及如何使用通知程序,我的圖像正常更改而沒有任何閃爍。在'新'圖像實際設置之前,您的'當前'圖像是否正在從屬性或內存中清除? – JToland 2010-08-17 11:13:29

+0

不,我還沒有嘗試過,因爲我不完全明白要做什麼。我是否更改了我的窗口,它具有從INotifyPropertyChanged繼承的Image元素? 因此,MainWownd:Window更改爲 MainWindow:INotifyPropertyChanged ?? 那麼窗戶中的其他元素呢? – xaria 2010-08-18 01:44:19