7

これまでに見た System.Reactive.dll のすべての例は、Events、EventArgs、および EventHandlers を扱っています。これなしでイベント通知が処理される例を誰かに見せてもらえないでしょうか。

たとえば、Microsoft の XNA フレームワークには、現在の MouseState を返す Mouse.GetState() という静的メソッドがあります (たとえば、mouseState.LeftButton == ButtonState.Pressed を使用すると、左ボタンが押されているかどうかを確認できます)。したがって、そもそも EventArgs やイベントなどはありません。これは、イベントの概念をまったく導入せずにイベント通知を実現する例として役立つと思います。

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

Observable は既存のイベントから作成できます。この目的で Observable.FromEvent を使用できます。UI 要素の拡張メソッドとして、このような GetMouseDown イベント ラッパーを記述できます。

 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 - More on .NET Reactive Extensionsを読んで、ソース コードを試してみてください。

于 2009-11-17T06:45:32.543 に答える