如何使用参数调用控件?我用Google搜索了,但无处可寻!
这是我得到的错误:
附加信息:参数计数不匹配。
当我简单检查文本框控件的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));
}
}
我做错了什么?而且,当我只想阅读其内容时,何时需要调用控件?
答案 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的所有访问。