我正在用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)
{
}
}
答案 0 :(得分:2)
Dispatcher.Invoke
需要Action
,即没有参数的delegate
。由于您未在方法中使用sender
和EventArgs
,因此请将方法更改为:
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
}
}