2017-06-01 81 views
1

簡單問題 - 當鼠標光標離開ContextMenu時,MouseLeave事件不會被調用,爲什麼會這樣? 我想在鼠標光標離開時關閉ContextMenu。 這裏是小樣本:鼠標離開時關閉上下文菜單

<Button Content="Right-click me!" VerticalAlignment="Center" HorizontalAlignment="Center"> 
     <Button.ContextMenu> 
      <ContextMenu MouseLeave="ContextMenu_MouseLeave"> 
       <MenuItem Header="Menu item 1" /> 
       <MenuItem Header="Menu item 2" /> 
       <Separator /> 
       <MenuItem Header="Menu item 3" /> 
      </ContextMenu> 
     </Button.ContextMenu> 
    </Button> 

回答

1

你可以處理MouseLeave事件爲ContextMenu的內部Border元素。

處理的Loaded事件ContextMenu本身,發現在視覺樹Border元素和掛鉤的事件處理程序的MouseLeave事件:

<Button Content="Right-click me!" VerticalAlignment="Center" HorizontalAlignment="Center"> 
    <Button.ContextMenu> 
     <ContextMenu Loaded="ContextMenu_Loaded"> 
      <MenuItem Header="Menu item 1" /> 
      <MenuItem Header="Menu item 2" /> 
      <Separator /> 
      <MenuItem Header="Menu item 3" /> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

private void ContextMenu_Loaded(object sender, RoutedEventArgs e) 
{ 
    ContextMenu cm = sender as ContextMenu; 
    Border border = GetChildOfType<Border>(cm); 
    border.MouseLeave += Border_MouseLeave; 
} 

private void Border_MouseLeave(object sender, MouseEventArgs e) 
{ 
    //do something here... 
} 

private static T GetChildOfType<T>(DependencyObject depObj) where T : DependencyObject 
{ 
    if (depObj == null) 
     return null; 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
    { 
     var child = VisualTreeHelper.GetChild(depObj, i); 

     var result = (child as T) ?? GetChildOfType<T>(child); 
     if (result != null) 
      return result; 
    } 
    return null; 
} 
+0

不應該'GetChildOfType'廣度優先而不是深度優先?它可能*在大多數情況下都不會影響,但我可以考慮一些邊緣情況,其中可能會出現深度優先問題。 –

+0

那麼,在這種情況下,你肯定不會發現任何區別,你只需要找到第一個Border元素:) – mm8

相關問題