2012-04-01 26 views
1

ボタンがあります。 Button.MouseRightButtonDownで、私はMouse.Capture(ボタン)を呼び出しています。なぜなら、誰かがボタンの右クリックを解放したかどうかを検出したいからです。Mouse.Capture()がアクティブな間にMouseLeaveイベントを取得できますか?

Button.MouseLeaveイベントも登録されています。誰かがマウスを右クリックしてドラッグすると、このイベントがトリガーされます。

残念ながら、Mouse.CaptureはMouseLeaveの発生をブロックしているようです。

誰かが回避策を知っていますか、あるいは間違っている箇所を指摘できますか?

(誰もが、私はこれをやっている好奇心旺盛かどうところで、my other questionを参照してください。)

答えて

4

マウスがキャプチャされると、MouseMoveとヒットテストを使用して、要素内のマウスかどうかを判断できます。次のコードは、ツリーウォークを回避するために使用することができる

protected override void OnMouseMove(MouseEventArgs e) 
{ 
    base.OnMouseMove(e); 

    if (this.IsMouseCaptured) 
    { 
     HitTestResult ht = VisualTreeHelper.HitTest(this, e.GetPosition(this)); 
     if (ht != null) 
     { 
      DependencyObject current = ht.VisualHit; 
      while (current != this && current != null) 
      { 
       current = VisualTreeHelper.GetParent(current); 
      } 

      if (current == this) 
      { 
       Debug.WriteLine("Inside"); 
       return; 
      } 
     } 

     Debug.WriteLine("Outside"); 
    } 
} 

:私の既存のコードで

protected override void OnMouseMove(MouseEventArgs e) 
{ 
    base.OnMouseMove(e); 

    if (this.IsMouseCaptured) 
    { 
     bool isInside = false; 

     VisualTreeHelper.HitTest(
      this, 
      d => 
      { 
       if (d == this) 
       { 
        isInside = true; 
       } 

       return HitTestFilterBehavior.Stop; 
      }, 
      ht => HitTestResultBehavior.Stop, 
      new PointHitTestParameters(e.GetPosition(this))); 

     if (isInside) 
     { 
      Debug.WriteLine("Inside"); 
     } 
     else 
     { 
      Debug.WriteLine("Outside"); 
     } 
    } 
} 
+0

それは美しく働いた。ありがとうございました。 –

0

あなたの関連の質問に私の答えに続いて、あなたがMouse.Captureの代わりにUIElementからCaptureMouse()を使用している場合(...)正しい動作が表示されます。

public class MyButton : Button 
{ 
    protected override void OnMouseRightButtonDown(MouseButtonEventArgs e) 
    { 
     base.OnMouseRightButtonDown(e); 
     CaptureMouse(); 
    } 

    protected override void OnMouseRightButtonUp(MouseButtonEventArgs e) 
    { 
     base.OnMouseRightButtonUp(e); 
     ReleaseMouseCapture(); 
    } 

    protected override void OnMouseEnter(MouseEventArgs e) 
    { 
     base.OnMouseEnter(e); 
     Debug.WriteLine("Mouse enter"); 
    } 

    protected override void OnMouseLeave(MouseEventArgs e) 
    { 
     base.OnMouseLeave(e); 
     Debug.WriteLine("Mouse leave"); 
    } 
} 
+0

、CaptureMouse(にMouse.Captureを()変更)は、任意の動作を変更するようには見えませんでした。 –

+0

私の簡単なテストでは、私はウィンドウとカスタムボタンを(上記のように)持っています。私がボタンを右クリックし、マウスからボタンを離すと、私は「マウス離脱」デバッグメッセージを得る。 – Phil

+1

XPとWin7の違いは? –

関連する問題