2009-08-23 3 views
7

Tutti gli esempi su System.Reactive.dll che ho visto finora riguardano Eventi, EventArgs e EventHandlers, mi chiedo se qualcuno possa mostrarmi un esempio in cui la notifica degli eventi viene gestita senza questo.È possibile sostituire la gestione tradizionale degli eventi in C# con il nuovo framework Reactive?

Ad esempio, nel framework XNA di Microsoft, si dispone di un metodo statico chiamato Mouse.GetState() che restituisce l'attuale MouseState (con mouseState.LeftButton == ButtonState.Pressed si può vedere se viene premuto il tasto sinistro, per esempio). Quindi non ci sono EventArgs, Events ecc. In primo luogo e penso che questo possa servire da esempio per ottenere la notifica degli eventi senza introdurre il concetto di un evento.

Potrebbe System.Reactive essere di aiuto qui? Qualcuno può avvolgere questo in un esempio con System.Reactive?

+0

Sì: http://rxinputmanager.codeplex.com/ – AlexFoxGill

risposta

2

Gli stati del mouse o della tastiera di polling funzionano in un gioco in cui si ha accesso diretto ai metodi di aggiornamento che sono l'heartbeat dell'applicazione. Il metodo di aggiornamento È il tuo evento che viene chiamato e trasmesso a molti oggetti, non molto diverso da MouseDown. Quindi anche qui fai affidamento sul modello di osservatore.

+1

Lo so, ma questo era una domanda specifica per quanto riguarda System.Reactive.dll e la sua IObservable , IObserver interfacce – kitsune

3

Citazione da un article che ho trovato utile:

In C#, un programmatore utilizza programmazione reattiva ogni volta che specifica un call-back per un'operazione asincrona o un gestore per un evento. Al termine dell'operazione asincrona o quando si verifica l'evento gestito, un metodo ottiene chiamato ed eseguito come reazione a l'evento.

Mouse.GetState() è un metodo che ottiene lo stato corrente del mouse. La programmazione reattiva sarebbe utile se si tentasse di gestire in modo continuo (reagire alle) modifiche allo stato del mouse.

Ad esempio, è possibile creare un wrapper che esegue il polling continuo dello stato del mouse, quindi avvisa i suoi osservatori (essenzialmente tornando agli eventi di pubblicazione qui). Potresti quindi scrivere codice per gestire (reagire a) quegli aggiornamenti.

0

È possibile creare osservabili da eventi esistenti. È possibile utilizzare Observable.FromEvent per questo scopo. Puoi scrivere un wrapper di eventi GetMouseDown come questo, come metodo di estensione per un elemento dell'interfaccia utente.

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;    
    } 

E in seguito, è possibile "gestire" il vostro evento in modo completamente dichiarativo. Mi piace

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

Ed ecco come creare un 'trascinamento' osservabile, con la posizione iniziale e la posizione corrente.

//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 

leggere questo articolo LINQ to Events - More on .NET Reactive Extensions e giocare con il codice sorgente.

+0

nota, è possibile codificare il proprio IObservable e implementazioni IObserver in C# 3.0, ma sfortunatamente non è possibile utilizzare la sintassi sopra per FromEvent, a causa dell'avvertenza CS1911 (http://msdn.microsoft.com/it-it/library/ms228459.aspx) – Benjol