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

In Concurrency in C# there is a 'MouseEventArgs' does not contain a definition for 'GetPosition'

我正在阅读 Stephen Cleary 的书 "Concurrency in 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。

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