WPF调用一个控件

时间:2010-10-25 16:52:05

标签: c# wpf invoke

如何使用参数调用控件?我用Google搜索了,但无处可寻!

invoke ui thread

这是我得到的错误:

  

附加信息:参数计数不匹配。

当我简单检查文本框控件的text属性是否为空时,会发生这种情况。这适用于WinForms:

if (this.textboxlink.Text == string.Empty)
   SleepThreadThatIsntNavigating(5000);

如果该行到了catch块并且向我显示该消息,它会从此跳转。

这是我尝试调用控件的方式:

// the delegate:
private delegate void TBXTextChanger(string text);

private void WriteToTextBox(string text)
{
    if (this.textboxlink.Dispatcher.CheckAccess())
    {
        this.textboxlink.Text = text;
    }
    else
    {
        this.textboxlink.Dispatcher.Invoke(
            System.Windows.Threading.DispatcherPriority.Normal,
            new TBXTextChanger(this.WriteToTextBox));
    }
}

我做错了什么?而且,当我只想阅读其内容时,何时需要调用控件?

2 个答案:

答案 0 :(得分:18)

当您调用Invoke时,您没有指定您的参数(text)。当Dispatcher尝试运行您的方法时,它没有要提供的参数,并且您会收到异常。

尝试:

this.textboxlink.Dispatcher.Invoke(
     System.Windows.Threading.DispatcherPriority.Normal,
     new TBXTextChanger(this.WriteToTextBox), text);

如果要从文本框中读取值,一个选项是使用lambda:

string textBoxValue = string.Empty;

this.textboxlink.Dispatcher.Invoke(DispatcherPriority.Normal, 
     new Action( () => { textBoxValue = this.textboxlink.Text; } ));

if (textBoxValue == string.Empty)
    Thread.Sleep(5000);

答案 1 :(得分:0)

Reed是正确的,但您需要这样做的原因是GUI元素不是线程安全的,因此必须在GUI线程上完成所有GUI操作,以确保正确读取内容。不太明显为什么这对于这样的读取操作是必要的,但是对于写入非常必要,因此.NET框架只需要在GUI线程中完成对GUI的所有访问。