2012-04-01 77 views
1

我有一個按鈕。在Button.MouseRightButtonDown上,我打電話給Mouse.Capture(button),因爲我想檢測是否有人在Button外部右鍵單擊。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

這工作很好。謝謝。 – 2012-04-02 18:14:55

0

從我的回答下面就您的相關問題,如果你在的地方Mouse.Capture的使用CaptureMouse()UIElement (...),那麼你會看到正確的行爲。

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

在我現有的代碼,改變Mouse.Capture()來CaptureMouse()並沒有出現改變的任何行爲。 – 2012-04-02 17:29:17

+0

在我的簡單測試中,我有一個窗口和一個自定義按鈕(如上)。如果我右鍵單擊按鈕,然後釋放鼠標離開按鈕,我會得到一個'鼠標離開'調試消息。 – Phil 2012-04-02 17:48:10

+1

XP與Win7的區別? – 2012-04-02 18:51:03

相關問題