2010-10-25 54 views
8

如何调用带参数的控件?我已经使用了这个,但没有找到!WPF调用控件

invoke ui thread

这是错误我得到:

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

而这种情况发生时,我做了一个简单的检查,文本控件的text属性是否为空。这部作品在的WinForms:

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

它这个,如果行catch块跳跃,并表明我的消息。

这是我尝试调用控制:

//委托: 私人委托无效TBXTextChanger(字符串文本);

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)); 
     } 
    } 

我在做什么错?自从我何时需要调用控件时,我只想阅读其内容?

回答

15

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

尝试:

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); 
+0

好吧,我修正了这个问题,那是我的第一个问题。但是,我如何阅读文本框的内容? – Yustme 2010-10-25 17:13:20

+0

通常情况下,你会在单独的线程中调用工作函数之前阅读它... – 2010-10-25 17:14:10

+0

但我必须经常阅读它。不只是在它之前。工作者线程是一个无限的线程,只有在程序关闭时才会停止。这个应用程序在WinForm中工作正常,即时将它迁移到WPF – Yustme 2010-10-25 17:23:54

0

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