4

そこの。私は C# .wpf を使用しています。これは C# ソースからいくつかのコードを取得していますが、使用できません。変更しなければならないことはありますか? またはしますか?

 // Delegates to enable async calls for setting controls properties
    private delegate void SetTextCallback(System.Windows.Controls.TextBox control, string text);

    // Thread safe updating of control's text property
    private void SetText(System.Windows.Controls.TextBox control, string text)
    {
        if (control.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            Invoke(d, new object[] { control, text });
        }
        else
        {
            control.Text = text;
        }
    }

上記のコードのように、エラーInvokeRequiredInvoke

目的は、コンテンツであるテキストボックスがあり、プロセスごとに増加することです。

これがテキストボックスのコードです。SetText(currentIterationBox.Text = iteration.ToString());

コードに何か問題がありますか?

助けてくれてありがとう

編集

// Delegates to enable async calls for setting controls properties
    private delegate void SetTextCallback(System.Windows.Controls.TextBox control, string text);

    // Thread safe updating of control's text property
    private void SetText(System.Windows.Controls.TextBox control, string text)
    {
        if (Dispatcher.CheckAccess())
        {
            control.Text = text;
        }
        else
        {
            SetTextCallback d = new SetTextCallback(SetText);
            Dispatcher.Invoke(d, new object[] { control, text });
        }
    }
4

3 に答える 3

10

Invokeあなたはおそらく、すべてのコントロールにメソッドがあるWindowsフォームからそのコードを取得しました。WPFでは、プロパティDispatcherからアクセスできるオブジェクトを使用する必要があります。Dispatcher

 if (control.Dispatcher.CheckAccess())
 {
     control.Text = text;
 }
 else
 {
     SetTextCallback d = new SetTextCallback(SetText);
     control.Dispatcher.Invoke(d, new object[] { control, text });
 }

SetTextさらに、正しく呼び出していません。2つの引数を取りますが、C#では等号ではなくコンマで区切られています。

SetText(currentIterationBox.Text, iteration.ToString());
于 2011-04-27T11:46:35.927 に答える
6

WPFでは、Control.Invokeを使用せず、Dispatcher.Invokeを次のように使用します。

Dispatcher.Invoke((Action)delegate(){
  // your code
});

使用する

Dispatcher.CheckAccess()

最初に確認します。

于 2011-04-27T11:47:26.217 に答える
3

次の構造を使用するWPFの場合:

if (control.Dispatcher.CheckAccess())
{
   ...
}
else
{
   control.Dispatcher.Invoke(...)
}
于 2011-04-27T11:48:24.877 に答える