你可以處理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