我正在編寫一個應用程序,它將顯示攝像機看到的當前圖像,並且需要實時或接近地更新顯示的圖像。基本上,我有一臺可以捕捉圖像的相機,我需要每隔1秒捕捉一個圖像並將該圖像顯示在屏幕上。目前,我的應用程序有一個Image控件,我從相機捕獲一個BitmapImage並將其設置爲Image.Source。我的麻煩是讓這個不斷更新。不幸的是,我沒有經驗來處理類似這樣的事情,它必須永遠更新自己(或者直到我正在寫的應用程序關閉),並且誠實地說,對於這些事情似乎沒有什麼(我已經能夠發現)網絡關於在WPF/C#中做這樣的事情。我懷疑我必須產生一個線程來執行圖像捕獲,但老實說,這是我的問題的一部分 - 我很少有與線程一起工作的經驗,並且對所有這些工作有些困惑。非常感謝您提供的任何幫助。在「實時」更新WPF控件
回答
要使數據綁定得到正確更新,可以使用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}}"
這應該使綁定正常工作。在單獨的線程上執行操作需要調度程序
您應該閱讀WPF中的數據綁定。一旦綁定的數據項發生改變,WPF就會充滿觀察者模式以更新顯示。事實上,你正在改變Image.Source而不是改變圖像的內容可能是令人困惑的事情。您需要將XAML中的圖像控件設置爲數據綁定到位圖對象(可能是您的表單的一個字段),然後根據需要更改或重新加載位圖對象。數據綁定的圖像控件應該在每次更改位圖對象時自動重繪。
由於您提到了後臺線程,因此您需要小心修改UI元素(圖像,位圖)的屬性,僅在UI線程上。如果您在後臺線程中收到新圖像並想在UI中顯示它,則需要將該更新同步到UI線程。請參閱Dispatcher。調用()
因爲它是WPF,所以使用[Dispatcher](http://msdn.microsoft.com/en-us/magazine/cc163328.aspx)是用於與UI線程同步的WPF方式。 – 2010-08-03 18:24:06
也許我沒有正確理解這個... Image控件沒有Content屬性,所以我將Source綁定到了表單的Property。我嘗試過: 但是,問題是,當我以後編程設置this.CurrentImage時,它從不更新Image控件-I只是得到一個空白的圖像。我做錯了什麼嗎?此外,所以要更新圖像每秒(或一段時間),你是否建議使用後臺線程來改變形式CurrentImage屬性或別的東西?再次感謝! – JToland 2010-08-03 18:29:11
@JToland:如果你綁定到你實現的屬性,你還需要在包含該屬性的類上實現INotifyPropertyChanged,以便數據綁定機制可以發現該屬性已經改變並作出相應的響應。在你的例子中,這將是表單類。請參閱MSDN上的示例實現:http://msdn.microsoft.com/en-us/library/ms229614.aspx – dthorpe 2010-08-03 19:41:50
我處於類似的情況,除了Image通過WCF傳遞給我的WPF客戶端。所以我設置了一個計時器並每隔1秒呼叫一次WCf服務。但是,當我將ImageSource分配給bitmapImage時,圖像閃爍,正如我獲得白色屏幕,圖像,白色屏幕,圖像 如何使其連續?
您是否嘗試過使用上面討論的方法?我知道什麼時候我的CurrentImage屬性發生了變化,以及如何使用通知程序,我的圖像正常更改而沒有任何閃爍。在'新'圖像實際設置之前,您的'當前'圖像是否正在從屬性或內存中清除? – JToland 2010-08-17 11:13:29
不,我還沒有嘗試過,因爲我不完全明白要做什麼。我是否更改了我的窗口,它具有從INotifyPropertyChanged繼承的Image元素? 因此,MainWownd:Window更改爲 MainWindow:INotifyPropertyChanged ?? 那麼窗戶中的其他元素呢? – xaria 2010-08-18 01:44:19
- 1. 在運行時更新WPF控件
- 2. Wpf - 在運行時更新自定義用戶控件
- 3. 每當控件更改WPF中的值時更新父級
- 4. WPF - 基於listviewitem選擇更改控件。控件不更新
- 5. WPF DependencyProperty不在WPF中更新用戶控件(ElementHost)
- 6. 更新WPF中ListBox控件的問題
- 7. WPF - 更新價值自定義控件
- 8. WPF用戶控件不更新路徑
- 9. 如何更新WPF上的控件MainWindow
- 10. WPF自定義控件不更新
- 11. wpf控件上的更新源代碼
- 12. WPF依存控制更新
- 13. WPF:更新不更新屏幕的控件的可見性
- 14. WPF控件初始化時未更新的屬性
- 15. 綁定到父控件屬性時,子WPF控件的綁定不會更新
- 16. 綁定事件到wpf列表實時更新
- 17. 實時監控網站更新
- 18. Maplacejs在更新時複製控件
- 19. 在WPF控件上實現SelectedValues屬性
- 20. 強制WPF控件刷新?
- 21. WPF:需要實時時間軸控制
- 22. 實時更新
- 23. 實時更新
- 24. 在WPF內部的WPF控件上實現點擊事件
- 25. 實時更新新頁面事件
- 26. 用戶控件未在窗口中更新(WPF)
- 27. 如何在wpf中完成屬性和控件更新?
- 28. WPF TextBox.Text不會在另一個控件中更新
- 29. Windows窗體Web瀏覽器用戶控件在WPF中更新
- 30. 刷新/更新WPF控件,如贏取表格
將這個答案與dthorpe的下面的作品完美結合!非常感謝你使這個非常清晰和防僞。非常感謝。 – JToland 2010-08-05 17:35:38