niks
niks

Reputation: 659

Close context menu when mouse leaves

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

Answers (1)

mm8
mm8

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

Related Questions