2010-11-26 17 views
0

私はVS 2010で非常に小さなWPF + Rxプログラムを作成しましたが、マウスイベントオブザーバブルでaltキーイベントを検出したような予期しない動作をしています。私は、例えば、コードを追跡し、ログに記録する機器いくつかのツールがすべてある[自分でさらにそれを診断する方法について 奇妙なイベントのクロストーク:マウス&キーボード、WPF&Rx?

  • アイデアやツール、特に何が間違って

    1. のいずれかのアドバイスに感謝するだろう何が起こっているのかをより明確に見ることができるように発砲されたイベント]]
    2. 行動を理解する方法は「設計上」ですか?私はWPFやRx、あるいはその両方を悪用していますか?

    それが正しく火災マウス移動オブザーバーは、マウスダウンから始まり、マウスアップで終了されないものを、まず下記の私はむしろ必要があるだろう行動を、得るためにどのよう

  • 。特定のテストオブザーバは、ウィンドウのタイトルバーに適切なmouseDown + mouseUp座標を配置しています(下記のコード+ XAMLを参照してください)。

    マウスが押されている間にaltキーを押して離すと、不自然さが始まります。それはすぐにmouseMoveイベントオブザーバを停止するようです。今、mouseButtonを解放すると、mouseMoveイベント・オブザーバが再び起動し、新しいmouseDownを生成するか、altを押してから再び離すまで続きます。さらにより多くの、私はすなわち

    mouseDown 
    mouseMove 
    alt-key down 
    alt-key up 
    mouseUp 
    alt-key down 
    alt-key up 
    

    、このシーケンスを通過してから、タイトルバーの通常

    mouseDown 
    mouseMove 
    

    印刷は、他の、無関係なイベントがあることを私に言って、いくつかの奇妙な点滅を持っている場合私の観察者のラムダを通して追跡されてポンプ輸送される。

    私はこれをalt以外のキーで失敗させることができず、謎を深めています。

    希望の動作は以下のようになり

    明示的
  • または別のイベントは、KeyDownイベントとkeyUpイベントイベントのためにストリームマウス移動ハンドラーにALTキーの状態をチェック
    1. のいずれか、と私はインターリーブを把握う私のコードで

    しかし、確かに、この振る舞いを持ち、さらに悪いことに、それを理解するための手がかりがないのは本当に悪いことです。私はどんなアイデアにも感謝しています!

    (注: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> 
    
  • 答えて

    1

    アプリケーションは、メインメニューを持っていますか? Altキーを押すとメニューバーがフォーカスされ、altキーを押すと前にフォーカスしていたものにフォーカスが戻ります。これはあなたが見ている機能を説明します。 (これはRxの問題のようには見えません)

    +0

    私はそれを見ていきます、リチャード。私はアプリにメニューを置くために何もしませんでした(上記のXAMLはすべてです)が、WPFの "Command"インフラストラクチャ全体がアクティブであるように見えます。スヌープツールは私を少し助けています。 blois.us/snoop。 –

    関連する問題