3

SerialPort DataReceived イベント ハンドラーから UI を更新したいと考えています。イベントハンドラーがフォームとは別のスレッドで暗黙的に実行されていたため、単にUIを更新するのではなく、問題を発見しました...

myLabel.Text = "Some text";

...次のアプローチを取る必要がありました。

    InvokeControlAction<Label>(myLabel, lbl=> lbl.Text= "Some text");
...
    public static void InvokeControlAction<t>(t cont, Action<t> action) where t : Control
    {
        if (cont.InvokeRequired)
        {
            cont.Invoke(new Action<t, Action<t>>(InvokeControlAction),
                          new object[] { cont, action });
        }
        else
        { 
            action(cont); 
        }
    }

これまでのところ良い...ただし、今は ToolStripStatusLabel を更新したい - 同じアプローチを使用すると、「ToolStripStatusLabel と Forms.Control の間に暗黙的な参照変換はありません」というエラーが発生します。

私が読んだことから、問題は ToolStripStatusLabel を呼び出すことができないという事実に起因します。

では、これをどのように処理するのが最善でしょうか?

注: 代理人などは私の現在の能力の限界にあるため、解決策と一緒に説明をいただければ幸いです。

更新 1:明確にするために、InvokeControlAction に相当する ToolStripStatusLabel を作成しようとしましたが、呼び出しメソッドがないため、これは機能しません。

結果:私のソリューションを再検討した後、ジミーが最初に提案したように、拡張メソッドとして実装しました。

静的なExtensionMethodクラス (独自の「ExtensionMethods」名前空間内) を作成し、InvokeOnToolStripItem メソッドに追加し、「using ExtensionMethods;」を追加しました。元のクラスでディレクティブを作成し、次のようにメソッドを呼び出しました。

tsStatusValue.InvokeOnToolStripItem(ts => ts.Text = "ALARM signal received");
4

2 に答える 2

2

ToolStripStatusLabelはから継承しませんControl。そのため、投稿した正確な理由で一般的な制約が失敗します。

さらに、ToolStripStatusLabel(またはToolStripItem実際には)メソッドがありませんInvoke。幸いなことに、メソッドToolStripを使用して簡単にアクセスできるhasが含まれています。GetCurrentParent

いずれかで機能する拡張メソッドは次のToolStripItemとおりです。

public static void InvokeOnToolStripItem<T>(this T item, Action<T> action)
    where T : ToolStripItem
{
    ToolStrip parent = item.GetCurrentParent();
    if (parent.InvokeRequired)
    {
        parent.Invoke((Delegate)action, new object[] { item });
    }
    else
    {
        action(item);
    }
}

次のように呼び出すだけで使用できます。

myToolStripLabel.InvokeOnToolStripItem(label => label.Text = "Updated!");
myToolStripProgressBar.InvokeOnToolStripItem(bar => bar.PerformStep());
于 2011-05-12T14:23:57.523 に答える
0

エラーメッセージを説明するために、あなたは書いた

where t : Control

ただし、ToolStripStatusLabel は Control から継承されません。

それがまったく役立つかどうかわからず、実際にはまだ解決策がありません:(

于 2011-05-12T14:32:07.910 に答える