2017-06-01 85 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

相关问题