WinForms からの私の古いコードは次のとおりです。
private void ValueChanged(double inValue1, double inValue2) {
//only manual mode for this driver, so that's easy.
if (ValueLabel.InvokeRequired) {
ValueLabel.Invoke(new MethodInvoker(delegate {
ValueLabel.Text = (inValue1* inValue2/ 1000).ToString("f1");
}
));
}
else {
ValueLabel.Text = (inValue1* inValue2/ 1000).ToString("f1");
}
}
これを WPF フレンドリーに変換する簡単な方法はありますか? これまでのところ、私は持っています:
private void KVPValueChanged(double inValue1, double inValue2) {
if (ValueLabel.Dispatcher.Thread == Thread.CurrentThread){
ValueLabel.Content = (inValue1* inValue2/ 1000).ToString("f1");
} else {
ValueLabel.Dispatcher.BeginInvoke(delegate {
ValueLabel.Content = (inValue1* inValue2/ 1000).ToString("f1");
});
}
}
しかし、その 2 番目の「デリゲート」呼び出しは失敗します。このデリゲートを呼び出すにはどうすればよいですか? デリゲート メソッドの作成、デリゲート メソッドのインスタンスの作成、その特定のインスタンスの呼び出しなどをすべて実行できると思いますが、これらの匿名デリゲートの全体的なポイントは、その面倒を避けることだと思いました。さらに、私の古い winforms コードには最初の実装がいたるところにあるため、すべてのデリゲートの匿名化を回避したいと考えています。
編集:以前と同じように MethodInvoker を使用しようとすることはできますが、コンパイラが混乱します。MethodInvoker は System.Windows.Forms の一部であるため、そのアプローチを使用しても機能しません。次のように:
private void ValueChanged(double inValue1, double inValue2) {
if (ValueLabel.Dispatcher.Thread == Thread.CurrentThread) {
ValueLabel.Content = (inValue1* inValue2/ 1000).ToString("f1");
}
else {
ValueLabel.Dispatcher.BeginInvoke(new System.Windows.Forms.MethodInvoker(delegate {
ValueLabel.Content = (inValue1* inValue2/ 1000).ToString("f1");
}));
}
}
その MethodInvoker の使用はコーシャではありません。それの別の実装、または同じ動作を使用する他の方法はありますか?