English 中文(简体)
Winforms WPF转换:BeginInvoke什么?
原标题:
  • 时间:2009-04-16 22:06:16
  •  标签:

这年代,我从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");
            });
        }
    }

但第二个委托调用失败。我如何调用这个委托?我想我可以穿过整个委托方法,使委托方法的一个实例,调用特定实例,等等,但我认为这些匿名代表的目的是为了避免麻烦。加上我的旧winforms代码,首先实现,所以我真的想避免de-anonymize我所有的代表。

<强>编辑:< /强>我可以尝试使用MethodInvoker像我之前,但编译器会困惑。MethodInvoker是System.Windows的一部分。形式,所以使用这种方法不工作。如:

    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不是犹太食品。有独立的实现,或其他方法使用相同的行为?

最佳回答

我认为你需要改变委托的签名:

ValueLabel.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate(invalue1, invalue2){
    ValueLabel.Content = ...

同时,查找使用BackgroundWorker组件。不仅对wpf而且winform异步操作。

问题回答

System.Windows.Forms。MethodInvoker只是一个代表,不带任何参数,并返回空。在WPF中,你可以把它换成< a href = " http://msdn.microsoft.com/en-us/library/system.action.aspx " rel = " noreferrer " > System.Action < / >。还有其他内置代表< a href = " http://msdn.microsoft.com/en-us/library/018hxwa8.aspx " rel = " noreferrer " > < / >接受参数,< a href = " http://msdn.microsoft.com/en-us/library/bb534960.aspx " rel = " noreferrer " > < / >,返回值或< a href = " http://msdn.microsoft.com/en-us/library/bb549151.aspx " rel = " noreferrer " > < / >。

在你的情况下,

ValueLabel.Dispatcher.BeginInvoke(new System.Windows.Forms.MethodInvoker(delegate {
            ValueLabel.Content = (inValue1* inValue2/ 1000).ToString("f1");
        }));

就变成了

ValueLabel.Dispatcher.BeginInvoke(new Action(delegate() {
            ValueLabel.Content = (inValue1* inValue2/ 1000).ToString("f1");
        }));




相关问题
热门标签