【问题标题】:WPF invoke a controlWPF 调用控件
【发布时间】:2018-04-16 17:31:29
【问题描述】:

如何调用带有参数的控件?我用谷歌搜索了这个,但没有找到!

invoke ui thread

这是我得到的错误:

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

当我简单地检查文本框控件的文本属性是否为空时,就会发生这种情况。这适用于 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));
    }
}

我做错了什么?当我只想读取控件的内容时,我什么时候必须调用它?

【问题讨论】:

    标签: c# wpf invoke


    【解决方案1】:

    当您调用 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);
    

    【讨论】:

    • 好的,我解决了这个问题,这是我的第一个问题。但是我如何阅读文本框的内容?
    • 通常,您会在单独线程中调用工作函数之前阅读它...
    • 但我必须不断地阅读它。不只是在它之前。工作线程是一个无限线程,只有在程序关闭时才会停止。这个应用程序在 WinForm 中运行良好,我正在将它迁移到 WPF
    • @Yustme:从技术上讲,这也可能是 Windows 窗体中的一个问题……您使用的是什么版本的 C#/VS?
    • 好的,谢谢。认为我需要在代码中做一个极端的改造。还是不行。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 2011-04-10
      • 2011-04-13
      • 1970-01-01
      相关资源
      最近更新 更多