在C#中的并发中,有一个'MouseEventArgs'不包含'GetPosition'的定义

时间:2019-02-01 09:04:25

标签: c# winforms system.reactive

我正在阅读Stephen Cleary的书“ C#Cookbook中的并发性”,在有关Rx Recipe 5.2将通知发送到上下文的章节中,有时需要在鼠标移动时进行CPU密集型计算。

因此,我们有以下示例代码:

 private void button3_Click(object sender, EventArgs e)
        {
            var uiContext = SynchronizationContext.Current;

            Trace.WriteLine("UI Thread is " + Environment.CurrentManagedThreadId);
            Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>(
                handler => (s, a) => handler(s, a),
                handler => MouseMove += handler,
                handler => MouseMove -= handler)
                .Select(evt => evt.EventArgs.GetPosition(this))
                .ObserveOn(Scheduler.Default)
                .Select(position =>
                {
                    //Complex Calculation
                    Thread.Sleep(100);
                    var result = position.X + position.Y;
                    Trace.WriteLine("Calculated Result " + result + " on thread " +
                        Environment.CurrentManagedThreadId);
                    return result;
                }
                )
                .ObserveOn(uiContext)
                .Subscribe(x => textBox1.Text = "Result " + x + "on Thread " + Environment.CurrentManagedThreadId
                );
        }

但是由于以下原因,代码无法编译: 'MouseEventArgs'不包含GetPosition的定义,找不到可以接受类型为MouseEventArgs的第一个参数的扩展方法GetPosition'。

我在这里错过了什么吗?

编辑:我在Documentation中看到的更多信息是MouseEventArgs 确实具有一个GetPosition函数,但是此MouseEventArgs是在System.Windows.Input命名空间中定义的,而我的代码中是在System.Windows.Forms上,我想知道这是否是问题

EDIT2:进一步调查,我发现其中different documentation!的MouseEventArgs没有GetPosition!

现在,我尝试在代码中使用System.Windows.Input。但是我的IDE表示此名称空间没有与第一个文档相矛盾的MouseEventArgs。

1 个答案:

答案 0 :(得分:3)

System.Windows.Input名称空间适用于WPF应用程序,因此您应该坚持使用System.Windows.FormsMouseEventArgs包含Location属性,该属性包含相对于触发事件的控件的鼠标坐标。我认为这相当于GetPosition