7

到目前为止,我看到的关于 System.Reactive.dll 的所有示例都处理事件、EventArgs 和 EventHandlers,我想知道是否有人可以向我展示一个在没有这个的情况下处理事件通知的示例。

例如,在 Microsoft 的 XNA 框架中,您有一个名为 Mouse.GetState() 的静态方法,它将返回当前的 MouseState(例如,使用 mouseState.LeftButton == ButtonState.Pressed 您可以查看是否按下了左键)。因此,首先没有 EventArgs、Events 等,我认为这可以作为实现事件通知的示例,而无需引入事件的概念。

System.Reactive 可以在这里提供帮助吗?任何人都可以用 System.Reactive 将其包装成一个示例吗?

4

3 回答 3

3

引用一篇我觉得有帮助的文章:

在 C# 中,程序员在为异步操作指定回调或为事件指定处理程序时使用反应式编程。当异步操作完成或处理的事件发生时,将调用并执行一个方法作为对事件的反应。

Mouse.GetState()是一种获取鼠标当前状态的方法。如果您试图持续处理(反应)鼠标状态的变化,反应式编程将很有用。

例如,您可以创建一个不断轮询鼠标状态的包装器,然后通知它的观察者(本质上是回到这里发布事件)。然后,您可以编写代码来处理(响应)这些更新。

于 2009-08-23T18:53:39.407 回答
2

轮询鼠标或键盘状态在您可以直接访问作为应用程序心跳的更新方法的游戏中起作用。update 方法是您的事件,它被调用并传递给许多对象,与 MouseDown 没有太大区别。因此,即使在这里,您也确实依赖于观察者模式。

于 2009-08-23T18:48:37.297 回答
0

您可以从现有事件创建 Observables。您可以为此目的使用 Observable.FromEvent。您可以像这样编写 GetMouseDown 事件包装器,作为 UI 元素的扩展方法。

 public static IObservable<Event<MouseButtonEventArgs>> 
                                      GetMouseDown (this UIElement el)
    {                        
        var allevents = Observable.FromEvent<MouseButtonEventHandler, MouseButtonEventArgs>
            (   h => new MouseButtonEventHandler(h), 
                h => el.MouseDown += h, 
                h=> el.MouseDown -= h
             );

        return allevents;            
    }   

稍后,您可以以完全声明的方式“处理”您的事件。喜欢

//create an observable declaratively
var mouseDowns=button.GetMouseDown(); 
//subcribe and do what ever you need
mouseDowns.Subscribe(arg=> MessageBox.Show(arg.ClickCount.ToString()) ); 

这里是如何创建一个具有初始位置和当前位置的“拖动”可观察对象。

  //Get the initial position and dragged points using LINQ to Events
            var mouseDragPoints = from md in e.GetMouseDown()
                                  let startpos=md.EventArgs.GetPosition(e)
                                  from mm in e.GetMouseMove().Until(e.GetMouseUp())
                                  select new
                                  {
                                      StartPos = startpos,
                                      CurrentPos = mm.EventArgs.GetPosition(e),
                                  };


 //And subscribe here to mouseDragPoints

阅读这篇文章LINQ to Events - 有关 .NET Reactive Extensions 的更多信息并使用源代码。

于 2009-11-17T06:45:32.543 回答