mmr*_*mmr 10 wpf delegates begininvoke winforms
这是来自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");
}
}
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法将其转换为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");
});
}
}
Run Code Online (Sandbox Code Playgroud)
但是第二个"代表"呼叫失败了.我该如何调用此委托?我想我可以完成整个制作委托方法,制作委托方法的实例,调用该特定实例等,但我认为这些匿名委托的重点是避免这种麻烦.另外,我的旧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");
}));
}
}
Run Code Online (Sandbox Code Playgroud)
MethodInvoker的使用不是犹太教.是否有单独的实现,或使用相同的行为的其他方式?
mje*_*nes 12
System.Windows.Forms.MethodInvoker只是一个不带参数且返回void的Delegate.在WPF中,您只需将其替换为System.Action即可.还有其他内置的Delegates 接受参数,返回值或两者.
在你的情况下,
ValueLabel.Dispatcher.BeginInvoke(new System.Windows.Forms.MethodInvoker(delegate {
ValueLabel.Content = (inValue1* inValue2/ 1000).ToString("f1");
}));
Run Code Online (Sandbox Code Playgroud)
变
ValueLabel.Dispatcher.BeginInvoke(new Action(delegate() {
ValueLabel.Content = (inValue1* inValue2/ 1000).ToString("f1");
}));
Run Code Online (Sandbox Code Playgroud)
我认为您需要更改委托的签名:
ValueLabel.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate(invalue1, invalue2){
ValueLabel.Content = ...
Run Code Online (Sandbox Code Playgroud)
此外,使用BackgroundWorker组件进行查找.不仅适用于wpf,还适用于winform异步操作.
| 归档时间: |
|
| 查看次数: |
15158 次 |
| 最近记录: |