以下是我在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");
});
}
}
但是第二次调用“delegate”失败了。我该如何调用这个委托?我想我可以通过创建一个委托方法,然后创建该委托方法的实例,调用该特定实例等方式来完成,但是我认为这些匿名委托的整个重点是避免这种麻烦。此外,我的旧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 不太合适。是否有单独的实现方法,或者其他使用相同行为的方式?