2010-05-27 30 views
0

我正在制作一个自定义菜单,并带有自定义菜单项。更改控件模板和样式一直是oke,但现在我想更改鼠标事件影响menuItems可见性的方式。交替默认菜单(Item)鼠标反应

默认情况下,当您在父菜单项的弹出框中单击MenuItem时,弹出窗口会折叠。当鼠标离开弹出保持打开。我想反过来,这样弹出只会在鼠标离开时折叠,并且子菜单项可以连续点击多次。

这可能吗?如果我能怎么做到这一点?

任何提供给我更多见解或导致解决方案的信息都是值得欢迎的!

感谢

回答

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; 
} 
+0

谢谢!我无法相信我在msdn读过那个属性,你的信息完全是我想要的,非常感谢。 – 2010-05-28 10:12:50