2

我正在用 wpf 应用程序编写 c#,但出现此错误

参数计数不匹配

在调用DoDisplay方法时。我不知道缺少哪个参数?

这是我的代码

public System.Windows.Controls.RichTextBox _displayWindow = new System.Windows.Controls.RichTextBox();

 public void DisplayData(messageType type, String msg)
 {
     _displayWindow.Dispatcher.Invoke(new EventHandler(DoDisplay));
 }

 public void DoDisplay(object sender, EventArgs e)
 {
    try {
       _displayWindow.Selection.Text  = string.Empty;
       _displayWindow.AppendText(_msg);
       _displayWindow.ScrollToEnd();
    }
    catch (Exception ex) 
    {
    }
 }
4

2 回答 2

2

Dispatcher.Invoke接受Action,即delegate不带参数的。由于您没有使用sender并且EventArgs在您的方法中,因此将您的方法更改为:

public void DoDisplay()
{
}

及其呼吁:

_displayWindow.Dispatcher.Invoke(new Action(() => DoDisplay()));

如果你想使用你delegate的被调用,那么你必须通过调用传递参数:

_displayWindow.Dispatcher.Invoke(YOURDELEGATE, YOURPARAMETERS)
于 2013-10-31T08:44:34.730 回答
1

要直接回答您的问题,您需要在使用调度程序调用 DoDisplay 时提供所需的参数,如下所示:

_displayWindow.Dispatcher.Invoke(new EventHandler(DoDisplay), this, null);

但是如果你只是想将文本附加到文本框,你真的不需要做任何这些,只需将你的代码直接放在 DisplayData 中:

public void DisplayData(string msg){
   _displayWindow.Selection.Text  = string.Empty;
   _displayWindow.AppendText(msg);
   _displayWindow.ScrollToEnd();
}

调度程序在您在后台线程上执行一些冗长的操作并且不想锁定 UI 的情况下最有用,您可以使用调度程序将单个命令发送到主线程。如果您在 UI 线程上,使用调度程序并没有真正做任何有用的事情。

如果您在后台线程上,并且想要更新文本框,您可以执行以下操作:

public void DisplayData(string msg)
{
    _displayWindow.Dispatcher.Invoke(new Action(() => UpdateTextbox(msg)));
}

public void UpdateTextbox(string msg)
{
    try
    {
        _displayWindow.Document.Blocks.Clear();
        _displayWindow.AppendText(msg);
        _displayWindow.ScrollToEnd();
    }
    catch (Exception ex)
    {
        //log ex
    }
}
于 2013-10-31T08:46:52.620 回答