Альтернативные реакции мыши (Меню) по умолчанию - PullRequest
0 голосов
/ 27 мая 2010

Я делаю настроенное меню, с настроенными пунктами меню. Изменение шаблонов и стилей элементов управления было хорошо, но теперь я хотел бы изменить способ, которым события мыши влияют на видимость menuItems.

По умолчанию при щелчке элемента MenuItem во всплывающем элементе родительского меню всплывающее окно будет свернуто. Когда мышь уходит, всплывающее окно остается открытым. Я хотел бы обратить это вспять, чтобы всплывающее окно свернуло только тогда, когда мышь уходит, и чтобы элемент подменю можно было нажимать несколько раз последовательно.

Возможно ли это? и если да, как я мог это сделать?

Любая информация, дающая мне более глубокое понимание или ведущая к решению проблемы, приветствуется!

Спасибо

1 Ответ

1 голос
/ 27 мая 2010

Используйте свойство StaysOpenOnClick для элементов меню, чтобы держать меню открытым при щелчке.

Меню закроется, когда оно потеряет фокус, что хорошо для меня. Если вы хотите автоматически закрыть меню, когда мышь больше не на нем, вам нужно сделать это в коде позади. Приведенный ниже код делает это для главного меню, проверяя, находится ли мышь за пределами области контекстного меню. Это работает только для меню без подменю. Если вы хотите использовать подменю, вам нужно выяснить, когда мышь находится над подменю, а когда нет.

<Window x:Class="MenuTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <Grid Background="Red">
        <Grid.ContextMenu>
            <ContextMenu MouseMove="ContextMenu_MouseMove">
                <MenuItem Header="Menu Item" StaysOpenOnClick="True" />
                <MenuItem Header="Menu Item" StaysOpenOnClick="True" />
                <MenuItem Header="SubMenu">
                    <MenuItem Header="Menu Item" StaysOpenOnClick="True" />
                </MenuItem>
            </ContextMenu>
        </Grid.ContextMenu>
    </Grid>
</Window>

Обработчик событий:

private void ContextMenu_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
    ContextMenu contextMenu = sender as ContextMenu;
    Point p = e.GetPosition(contextMenu);
    contextMenu.IsOpen = p.X >= 0 && p.X <= contextMenu.ActualWidth && p.Y >= 0 && p.Y <= contextMenu.ActualHeight;
}
...