我正在制作一个自定义菜单,带有自定义菜单项。更改控件模板和样式已经过了,但现在我想改变鼠标事件影响menuItems可见性的方式。
默认情况下,当您在父菜单项的弹出窗口中单击MenuItem时,弹出窗口将崩溃。当鼠标离开弹出窗口时保持打开状态。我想反过来这样,弹出窗口只会在鼠标离开时崩溃,并且可以按顺序多次点击子菜单项。
这可能吗?如果我怎么能这样做?
欢迎提供更多见解或提供解决方案的任何信息!
由于
答案 0 :(得分:1)
在菜单项上使用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;
}