2014-02-19 39 views
0

我試圖更新從另一個線程中的事件我的用戶界面中的圖像。我正在使用Dispatcher(基於這個問題:Fire events from different thread)這樣做,但仍然得到「調用線程無法訪問此對象,因爲不同的線程擁有它」 - 錯誤消息i.Source = s;。這樣做的正確方法是什麼?通過調度程序更新映像仍然給「不同的線程擁有它」錯誤

void OnEvent(object sender, EventArgs e) 
{ 
    ImageSource s = e.Image; 
    Dispatcher.BeginInvoke((Action)(
     () => UpdateUI(myImage, s) 
    )); 
} 

void UpdateUI(Image i, ImageSource s) 
{ 
    i.Source = s; 
} 

非常感謝您的任何建議!

+0

您正在調度當前線程,而不是UI線程。您首先需要訪問UI線程調度程序。你從什麼樣的對象派遣? – BatteryBackupUnit

回答

1

ImageSource的修復它不能被指定爲源UI控制。

,您可以訪問myImage.Dispatcher得到與圖像控制相關的實際調度員:

myImage.Dispatcher.BeginInvoke((Action)delegate  
    { 
    ImageSource s = e.Image; 
    UpdateUI(myImage, s); 
    }); 

OR

呼叫Freeze()ImageSource分配之前。凍結對象可以通過線程訪問。

+1

謝謝,我設法使用'Freeze()'和'ImageSource s = e.Image.Clone();'來完成它。使用myImage.Dispatcher沒有任何幫助。 – DIF

+0

很棒.. !!那是在'Dispatcher'不正確的情況下。主要問題是我在答案中加粗的那個。 –

0

您正在調度您當前的線程,而不是UI線程。您首先需要訪問UI線程調度程序。使用

Application.Current.Dispatcher.BeginInvoke(...) 

代替。

也看到了這個問題:How do I get the UI thread Dispatcher?

+0

使用'Application.Current.Dispatcher' myImage.Dispatcher'沒有改進任何東西。我現在要用'Freeze()'來進行。謝謝! – DIF

1

因爲你ImageSource已經在不同的線程,那麼你要使用它的一個創建你得到這個錯誤。你可以通過調用Freeze()在後臺線程創建了ImageSource

ImageSource s = e.Image; 
s.Freeze(); 
+1

謝謝,我設法使用Freeze()和ImageSource完成s = e.Image.Clone(); – DIF

相關問題