web-dev-qa-db-ja.com

WPFはコントロールを呼び出します

パラメータを使用してコントロールを呼び出すにはどうすればよいですか?私はこれをグーグルで検索しましたが、どこにも見つかりません!

Iスレッドを呼び出す

これは私が得るエラーです:

追加情報:パラメーター数の不一致。

これは、テキストボックスコントロールのtextプロパティが空かどうかを簡単に確認すると発生します。これはWinFormsで機能します。

if (this.textboxlink.Text == string.Empty)
   SleepThreadThatIsntNavigating(5000);

行がcatchブロックの場合、これからジャンプして、そのメッセージを表示します。

これは私がコントロールを呼び出そうとする方法です:

// the delegate:
private delegate void TBXTextChanger(string text);

private void WriteToTextBox(string text)
{
    if (this.textboxlink.Dispatcher.CheckAccess())
    {
        this.textboxlink.Text = text;
    }
    else
    {
        this.textboxlink.Dispatcher.Invoke(
            System.Windows.Threading.DispatcherPriority.Normal,
            new TBXTextChanger(this.WriteToTextBox));
    }
}

私は何が間違っているのですか?そして、コンテンツを読みたいときにコントロールを呼び出す必要があるのはいつからですか?

14
Yustme

Invokeを呼び出すときは、引数(text)を指定していません。 Dispatcherがメソッドを実行しようとすると、指定するパラメーターがなく、例外が発生します。

試してください:

this.textboxlink.Dispatcher.Invoke(
     System.Windows.Threading.DispatcherPriority.Normal,
     new TBXTextChanger(this.WriteToTextBox), text);

テキストボックスから値を読み取りたい場合、1つのオプションはラムダを使用することです。

string textBoxValue = string.Empty;

this.textboxlink.Dispatcher.Invoke(DispatcherPriority.Normal, 
     new Action( () => { textBoxValue = this.textboxlink.Text; } ));

if (textBoxValue == string.Empty)
    Thread.Sleep(5000);
23
Reed Copsey

リードは正しいですが、これを行う必要がある理由は、GUI要素がスレッドセーフではないため、コンテンツが正しく読み取られるように、すべてのGUI操作をGUIスレッドで実行する必要があるためです。このような読み取り操作でこれが必要な理由はあまり明白ではありませんが、書き込みでは非常に必要であるため、.NETFrameworkではGUIへのすべてのアクセスをGUIスレッドで実行する必要があります。

0