2011-04-27 62 views
4

那裏。 我正在使用C#.wpf,並且我從C#源代碼獲取了一些代碼,但是我無法使用它。有什麼我必須改變?還是做?線程在C#中調用.WPF

// Delegates to enable async calls for setting controls properties 
    private delegate void SetTextCallback(System.Windows.Controls.TextBox control, string text); 

    // Thread safe updating of control's text property 
    private void SetText(System.Windows.Controls.TextBox control, string text) 
    { 
     if (control.InvokeRequired) 
     { 
      SetTextCallback d = new SetTextCallback(SetText); 
      Invoke(d, new object[] { control, text }); 
     } 
     else 
     { 
      control.Text = text; 
     } 
    } 

如上碼,該錯誤是在InvokeRequiredInvoke

目的是,我有一個文本框,其是內容,將遞增爲每個進程。

這裏是文本框的代碼。 SetText(currentIterationBox.Text = iteration.ToString());

代碼有什麼問題嗎?

感謝您的幫助

編輯

// Delegates to enable async calls for setting controls properties 
    private delegate void SetTextCallback(System.Windows.Controls.TextBox control, string text); 

    // Thread safe updating of control's text property 
    private void SetText(System.Windows.Controls.TextBox control, string text) 
    { 
     if (Dispatcher.CheckAccess()) 
     { 
      control.Text = text; 
     } 
     else 
     { 
      SetTextCallback d = new SetTextCallback(SetText); 
      Dispatcher.Invoke(d, new object[] { control, text }); 
     } 
    } 
+0

而究竟是什麼錯誤? – 2011-04-27 11:40:00

+0

你有沒有得到任何錯誤,或者你只假定你的代碼有錯誤? – sikender 2011-04-27 11:41:51

+1

有什麼建議嗎?錯誤'System.Windows.Controls.TextBox'不包含'InvokeRequired'的定義,並且沒有找到接受'System.Windows.Controls.TextBox'類型的第一個參數的擴展方法'InvokeRequired'(你是否缺少使用指令或程序集引用?) – Reza 2011-04-27 11:43:30

回答

9

你可能把代碼從Windows窗體,其中每個控制有一個Invoke方法。在WPF中,你需要通過一個Dispatcher財產使用Dispatcher對象,可訪問:

if (control.Dispatcher.CheckAccess()) 
{ 
    control.Text = text; 
} 
else 
{ 
    SetTextCallback d = new SetTextCallback(SetText); 
    control.Dispatcher.Invoke(d, new object[] { control, text }); 
} 

此外,你不正確調用SetText。它有兩個參數,這在C#用逗號分開,不是等號:

SetText(currentIterationBox.Text, iteration.ToString()); 
+0

我已經編輯上面的代碼。你是這個意思嗎? – Reza 2011-04-27 11:54:27

+0

當我將其稱爲「SetText(currentIterationBox.Text = iteration.ToString());」時,仍然出現錯誤 – Reza 2011-04-27 11:55:48

+3

@Reza:**什麼錯誤?**你爲什麼認爲他們寫錯誤描述?因爲它很有趣?你甚至讀過它嗎?我敢打賭,它解釋了什麼是錯的。 – 2011-04-27 11:59:45

6

在WPF你不使用Control.Invoke但Dispatcher.Invoke這樣的:

Dispatcher.Invoke((Action)delegate(){ 
    // your code 
}); 

使用

Dispatcher.CheckAccess() 

先檢查。

+0

我編輯我的代碼上面,這是正確的嗎?因爲當我像這樣調用SetText(currentIterationBox.Text = iteration.ToString())時它仍然出現錯誤; – Reza 2011-04-27 11:55:29

+0

SetText是一個帶有兩個參數的方法,一個是texbox,另一個是字符串。你應該像這樣調用它:SetText(currentIterationBox,iteration.ToString()); – 2011-04-27 12:03:08

+0

非常感謝..它的作品... – Reza 2011-04-27 12:42:14

3

在使用WPF未來建設:

if (control.Dispatcher.CheckAccess()) 
{ 
    ... 
} 
else 
{ 
    control.Dispatcher.Invoke(...) 
}