私はVS 2010で非常に小さなWPF + Rxプログラムを作成しましたが、マウスイベントオブザーバブルでaltキーイベントを検出したような予期しない動作をしています。私は、例えば、コードを追跡し、ログに記録する機器いくつかのツールがすべてある[自分でさらにそれを診断する方法について 奇妙なイベントのクロストーク:マウス&キーボード、WPF&Rx?
- のいずれかのアドバイスに感謝するだろう何が起こっているのかをより明確に見ることができるように発砲されたイベント]]
- 行動を理解する方法は「設計上」ですか?私はWPFやRx、あるいはその両方を悪用していますか?
それが正しく火災マウス移動オブザーバーは、マウスダウンから始まり、マウスアップで終了されないものを、まず下記の私はむしろ必要があるだろう行動を、得るためにどのよう
マウスが押されている間にaltキーを押して離すと、不自然さが始まります。それはすぐにmouseMoveイベントオブザーバを停止するようです。今、mouseButtonを解放すると、mouseMoveイベント・オブザーバが再び起動し、新しいmouseDownを生成するか、altを押してから再び離すまで続きます。さらにより多くの、私はすなわち
mouseDown
mouseMove
alt-key down
alt-key up
mouseUp
alt-key down
alt-key up
、このシーケンスを通過してから、タイトルバーの通常
mouseDown
mouseMove
印刷は、他の、無関係なイベントがあることを私に言って、いくつかの奇妙な点滅を持っている場合私の観察者のラムダを通して追跡されてポンプ輸送される。
私はこれをalt以外のキーで失敗させることができず、謎を深めています。
希望の動作は以下のようになり
明示的- のいずれか、と私はインターリーブを把握う私のコードで
しかし、確かに、この振る舞いを持ち、さらに悪いことに、それを理解するための手がかりがないのは本当に悪いことです。私はどんなアイデアにも感謝しています!
(注:System.coreex、System.Reactive、およびSystem.Interactiveへの参照を追加)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Input;
namespace DownAndMoveTest
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
(from mDown in this.GetLeftMouseDownObservable().
Do(e => this.Title = "DOWN: " + e.EventArgs.GetPosition(this).ToString())
let mDownP = mDown.EventArgs.GetPosition(this)
from mMove in this.GetMouseMoveObservable().TakeUntil(this.GetLeftMouseUpObservable())
select new
{
D = mDownP,
M = mMove.EventArgs.GetPosition(this)
}).Subscribe(ps =>
{
this.Title = String.Format(
"Window MouseDown({0:G}, {1:G}), MouseMove({2:G}, {3:G})",
ps.D.X, ps.D.Y,
ps.M.X, ps.M.Y);
});
}
}
public static partial class UIElementExtensions
{
public static IObservable<IEvent<MouseButtonEventArgs>>
GetLeftMouseDownObservable(this UIElement uiElement)
{
return Observable.FromEvent<MouseButtonEventHandler, MouseButtonEventArgs>(
h => new MouseButtonEventHandler(h),
h => uiElement.MouseLeftButtonDown += h,
h => uiElement.MouseLeftButtonDown -= h);
}
public static IObservable<IEvent<MouseEventArgs>>
GetMouseMoveObservable(this UIElement uiElement)
{
return Observable.FromEvent<MouseEventHandler, MouseEventArgs>(
h => new MouseEventHandler(h),
h => uiElement.MouseMove += h,
h => uiElement.MouseMove -= h);
}
public static IObservable<IEvent<MouseButtonEventArgs>>
GetLeftMouseUpObservable(this UIElement uiElement)
{
return Observable.FromEvent<MouseButtonEventHandler, MouseButtonEventArgs>(
h => new MouseButtonEventHandler(h),
h => uiElement.MouseLeftButtonUp += h,
h => uiElement.MouseLeftButtonUp -= h);
}
}
}
とそのXAML
<Window x:Class="DownAndMoveTest.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>
</Grid>
</Window>
私はそれを見ていきます、リチャード。私はアプリにメニューを置くために何もしませんでした(上記のXAMLはすべてです)が、WPFの "Command"インフラストラクチャ全体がアクティブであるように見えます。スヌープツールは私を少し助けています。 blois.us/snoop。 –