2010-07-23 13 views
0

Salut les gars, je suis très très très nouveau à Rx et essayer de mettre en place une application de test simple. Il s'abonne fondamentalement à l'événement de clic de fenêtre en utilisant Rx et définit le texte sur une zone de texte à "Cliqué". C'est une application wpf. Voici le XAML:J'ai désespérément besoin d'aide sur Rx.Net

<Window x:Class="Reactive.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Canvas> 
     <TextBlock Name="txtClicked" Text="Rx Test"/>    
    </Canvas> 
</Grid> 

et voici le code sous-jacent:

using System; 
using System.Linq; 
using System.Windows; 
using System.Windows.Input; 

namespace Reactive 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
public partial class MainWindow : Window 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="MainWindow"/> class. 
    /// </summary> 
     public MainWindow() 
     { 
     InitializeComponent(); 

     var xs = from evt in Observable.FromEvent<MouseEventArgs>(this, "MouseDown") 
       select evt; 

     xs.ObserveOnDispatcher().Subscribe(value => txtClicked.Text = "Clicked"); 
    } 
} 
} 

Mais pour une raison quelconque le code ne fonctionne pas. Je reçois le message:

L'appel du constructeur sur le type 'Reactive.MainWindow' qui correspond aux contraintes de liaison spécifiées a généré une exception. ' Ligne numéro '3' et la position de la ligne « 9

message InnnerException:

Le délégué de l'événement doit être de la forme vide Handler (objet, T) où T: EventArgs.

S'il vous plaît aider !!!

+0

Peut être obtenu grâce aux exemples suivants. http://rxwiki.wikidot.com/101samples#toc6 – Ragunathan

Répondre

2

Je ne peux pas vérifier maintenant, mais je crois que le problème est que vous utilisez la mauvaise classe EventArgs. L'événement Window.MouseDown est de type MouseButtonEventHandler, vous devez donc utiliser MouseButtonEventArgs:

var xs = Observable.FromEvent<MouseButtonEventArgs>(this, "MouseDown"); 

(Votre expression de requête n'a pas été vraiment faire quelque chose dans ce cas - vous pouvez le mettre en arrière si vous voulez ajouter des clauses WHERE, etc.)

4

Probablement trop tard, mais je suggère que vous utilisiez la méthode fortement typée FromEventPattern chaque fois que vous voulez un observable d'un événement.

IObservable<IEvent<TEventArgs>> FromEventPattern<TDelegate, TEventArgs>(
    Func<EventHandler<TEventArgs>, TDelegate> conversion, 
    Action<TDelegate> addHandler, 
    Action<TDelegate> removeHandler) 
    where TEventArgs: EventArgs 

Dans votre code vous l'utiliser comme ceci:

public partial class MainWindow : Window 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="MainWindow"/> class. 
    /// </summary> 
    public MainWindow() 
    { 
     InitializeComponent(); 

     var xs = Observable 
      .FromEventPattern<MouseButtonEventHandler, MouseButtonEventArgs>(
       h => (s, ea) => h(s, ea), 
       h => this.MouseDown += h, 
       h => this.MouseDown -= h); 

     _subscription = xs 
      .ObserveOnDispatcher() 
      .Subscribe(_ => txtClicked.Text = "Clicked"); 
    } 

    private IDisposable _subscription = null; 
} 

Aussi, vous devez utiliser une variable d'abonnement (ou liste abonnements) pour tenir le IDisposable renvoyé de l'appel Subscribe. Et tout comme la suppression d'un gestionnaire d'événements lorsque vous fermez votre formulaire, vous devez également disposer de votre abonnement lorsque vous avez terminé.