2

RX は初めてですが、解決したいタスクに適切なソリューションを提供できるはずだと感じています。かなりの検索の後、私はまだ解決策を見つけていません。

いくつかのマウス移動イベントに応答してコントロールが何らかの作業を行う WPF アプリケーションがあります。イベントの頻度を減らして、現在よりもハンドラーが呼び出される頻度を減らしたいと思います (ユーザーがコントロール上でマウスを動かしたとき)。理想的には、オブザーバーをセットアップしてサブスクライブすることです。オブザーバーは、マウス移動イベントを観察し、特定の時間枠 (0.2 秒など) が経過した後、最新のイベントと引数を使用してクライアント コードを呼び出す必要があります。RX を初めて使用するので、最初に次のように、元の標準イベント フックアップをオブザーバーに置き換えました。

var mouseMove = Observable.FromEventPattern<MouseEventArgs>(myControl, "MouseMove");

mouseMove.Subscribe(args => myControl_MouseMove(args.Sender, args.EventArgs)); 

これはうまくいくように見えました。

次に、オブザーバーを変更して、上記の動作を取得しようとしました。Throttle() 呼び出しと Sample() 呼び出しを使用してみました。これらは、私が期待した(または望んでいた)結果をもたらしませんでした。実際、特定のケースでは、Throttle/TimeSpan 呼び出しの特定のオーバーロードを使用すると、アプリケーションが停止しましたが、これはまだ理解できません。

これは私が試したものの例です:

var mouseMove = Observable.FromEventPattern<MouseEventArgs>(myControl, "MouseMove").Throttle(TimeSpan.FromSeconds(0.2));

mouseMove.Subscribe(args => myControl_MouseMove(args.Sender, args.EventArgs)); 

読み取りによると、Throttle は頻度が特定のしきい値を下回るまでイベントを飲み込むように見えますが (私が予想したものとはまったく異なります)、Sample は観測されたイベントを定期的にサンプリングしていると思いますか? 特定の時間間隔でクライアント コードに最新のイベントが与えられるようにしたいと考えています。その間隔でイベントが記録されていない場合、クライアントは呼び出されません。

誰かがRX初心者を助けてくれることを願っています。

ああ、私はまた、コントロールの存続期間中、(頻度を減らした) マウスの移動について通知を受けたいと思っています。

マックス

4

1 に答える 1