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.InvokeAction、つまりパラメータなしのを取りdelegateます。senderメソッドでandを使用していないEventArgsため、 Method を次のように変更します。

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 に答える