你可以处理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;
}
来源
2017-06-01 16:13:57
mm8
不应该'GetChildOfType'广度优先而不是深度优先?它可能*在大多数情况下都不会影响,但我可以考虑一些边缘情况,其中可能会出现深度优先问题。 –
那么,在这种情况下,你肯定不会发现任何区别,你只需要找到第一个Border元素:) – mm8