0

こんにちは、私は Rx の初心者で、簡単なテスト アプリを作成しようとしています。基本的に、Rx を使用してウィンドウ クリック イベントをサブスクライブし、テキスト ボックスのテキストを "Clicked" に設定します。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

InnerException メッセージ:

イベント デリゲートは、void Handler(object, T) の形式である必要があります。ここで、T : EventArgs.

助けてください!!!

4

2 に答える 2

4

遅すぎるかもしれませんがFromEventPattern、イベントからオブザーバブルが必要な場合は常に、厳密に型指定されたメソッドを使用することをお勧めします。

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

コードでは、次のように使用します。

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また、フォームを閉じるときにイベント ハンドラーを削除するのと同じように、完了したらサブスクリプションも破棄する必要があります。

于 2011-01-17T03:30:39.047 に答える
2

今は確認できませんが、間違ったEventArgsクラスを使用していることが問題だと思います。Window.MouseDownイベントのタイプはMouseButtonEventHandlerであるため、次を使用する必要がありますMouseButtonEventArgs

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

(この場合、クエリ式は実際には何もしていませんでした。where 句などを追加したい場合は、元に戻すことができます。)

于 2010-07-23T05:24:16.143 に答える