Reputation: 659
Simple question - MouseLeave event doesn't get called when mouse cursor leaves ContextMenu, why is it so? I would like to close ContextMenu when mouse cursor has left it. Here is little sample:
<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>
Upvotes: 2
Views: 990
Reputation: 169160
You could handle the MouseLeave
event for the internal Border
element of the ContextMenu
.
Handle the Loaded
event of the ContextMenu
itself, find the Border
element in the visual tree and hook up an event handler to its MouseLeave
event:
<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;
}
Upvotes: 3