调用方法时“参数计数不匹配”

时间:2013-10-31 08:38:43

标签: c# wpf

我正在用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) 
    {
    }
 }

2 个答案:

答案 0 :(得分:2)

Dispatcher.Invoke需要Action,即没有参数的delegate。由于您未在方法中使用senderEventArgs,因此请将方法更改为:

public void DoDisplay()
{
}

及其致电:

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

如果您想使用delegate进行调用,则必须通过调用传递参数:

_displayWindow.Dispatcher.Invoke(YOURDELEGATE, YOURPARAMETERS)

答案 1 :(得分: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
    }
}