2011-04-27 35 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(...) 
}