Отчаянно нуждаюсь в помощи на Rx.Net - PullRequest
0 голосов
/ 23 июля 2010

Привет, ребята, я очень, очень новичок в Rx и пытаюсь собрать простое тестовое приложение. Он в основном подписывается на событие щелчка окна, используя Rx, и устанавливает для текста в текстовом поле значение «Нажатие». Это приложение wpf. Вот xaml:

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

и вот код:

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

Но по какой-то причине код не запускается. я получаю сообщение:

Вызов конструктора для типа 'Reactive.MainWindow', который соответствует указанным ограничениям связывания, вызвал исключение. ' Номер строки '3' и позиция строки '9

InnnerException сообщение:

Делегат события должен иметь форму void Handler (object, T), где T: EventArgs.

Пожалуйста, помогите !!!

Ответы [ 2 ]

4 голосов
/ 17 января 2011

Возможно, слишком поздно, но я предлагаю использовать строго типизированный метод FromEventPattern всякий раз, когда вы хотите, чтобы наблюдаемое из события.

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

В вашем коде вы использовали бы его так:1005 *

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

Также вы должны использовать переменную подписки (или список подписок) для хранения IDisposable, возвращенного из вызова Subscribe.И так же, как удаление обработчика событий при закрытии формы, вы также должны утилизировать свою подписку, когда закончите.

2 голосов
/ 23 июля 2010

Я не могу проверить прямо сейчас, но я считаю, что проблема в том, что вы используете неправильный EventArgs класс. Событие Window.MouseDown имеет тип MouseButtonEventHandler, поэтому вы должны использовать MouseButtonEventArgs:

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

(В этом случае ваше выражение запроса ничего не делало - вы можете вернуть его обратно, если хотите добавить оператор where и т. Д.)

...