17

私はほとんどのアプリケーションの下部にある StatusStrip を使用して、単純なステータス更新と、場合によっては進行状況バーを使用する傾向があります。

ただし、ToolStripStatusLabels はコントロールから継承されないように見えるため、.Invoke または .InvokeRequired はありません。では、テキスト プロパティを変更するためにスレッド セーフで呼び出しを行うにはどうすればよいでしょうか。

検索に来る後世や他の人のためのコード化された回答:

Action<string> test=(text) =>
            {
                if (this._statusStrip.InvokeRequired) this._statusStrip.Invoke(
               new MethodInvoker(() => this._lblStatus.Text = text));
                else this._lblStatus.Text = text;
            };

また

private void TestInvoker(string text)
    {
        if (this._statusStrip.InvokeRequired) 
            this._statusStrip.Invoke(
                   new MethodInvoker(() => this._lblStatus.Text = text));
        else this._lblStatus.Text = text;
    }
4

5 に答える 5

29

これは良い質問です!

はコントロールから継承しませToolStripStatusLabelんが、包含は継承ToolStripします! を含むToolStripの Invoke を使用して、 に対して呼び出しを行いますToolStripStatusLabel

これは、ToolStrip がそのコンポーネント ビットの描画を手動で処理するためです。これは、WPF がすべてのコンポーネント ビットの描画を管理するのとほぼ同じ方法で、それぞれに個別のハンドルを生成せずに行うためです。Controlこれは、すべてに関連付けられていることを忘れがちでHANDLEあり、システムには限定された数しかないため、便利です。

(以前にもこれに遭遇しました。たとえば、別の質問のサイドバーで言及しました。最近の理解を反映するようにそのテキストを更新する必要があります。)

于 2009-07-14T20:54:35.710 に答える
2

また、一般に、操作しているコントロールが同じスレッドで作成されていることを保証できる限り (たとえばフォームの初期化ルーチン)、InvokeRequired /BeginInvoke を呼び出している UI 要素として。

于 2009-07-14T20:58:53.893 に答える