有没有一种方法可以通过编程方式关闭WPF中的菜单项
我在wpf中有一个菜单,上面有一个输入框和一个按钮。一旦用户点击按钮,我需要关闭菜单 有办法做到这一点吗有没有一种方法可以通过编程方式关闭WPF中的菜单项,wpf,menu,menuitem,Wpf,Menu,Menuitem,我在wpf中有一个菜单,上面有一个输入框和一个按钮。一旦用户点击按钮,我需要关闭菜单 有办法做到这一点吗 <Menu x:Name="MainMenu"> <MenuItem Header="Main"> <MenuItem Header="SubMenu" x:Name="SubMenu"> <StackPanel Orientation="Horizontal">
<Menu x:Name="MainMenu">
<MenuItem Header="Main">
<MenuItem Header="SubMenu" x:Name="SubMenu">
<StackPanel Orientation="Horizontal">
<TextBox Width="50" x:Name="TextBox" />
<Button Content="Click Me and Close" x:Name="Button" IsDefault="True"/>
</StackPanel>
</MenuItem>
</MenuItem>
谢谢,
Jon抓住
菜单项
并执行以下操作:
_menuItem.IsSubmenuOpen = false;
轻松掌握它的方法:
<Button x:Name="_button" Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MenuItem}, AncestorLevel=2}"/>
我发现使用
IsSubmenuOpen
无法正确消除包含MenuItem
的菜单的焦点(特别是如果菜单位于工具栏中,即使菜单处于“关闭”状态,顶级MenuItem
仍保持选中状态)。我发现将MouseUp
事件发送到MenuItem
效果更好(在按钮或嵌套控件中,单击事件处理程序):
史蒂夫:谢谢你的解决方案。这实际上是正确的答案,最后是一些在互联网上大量错误答案之外真正有效的东西。基于您的anwser,我有一个更短(更安全)的解决方案。因为按钮的直接父项(例如父项)并不总是MenuItem(来自原始答案StackPanel),所以您的解决方案将不起作用。因此,只需设置MenuItem(Name=“MyMenuItem”)的Name属性,并将此处理程序挂接到按钮上:
private void Button_Click(object sender, RoutedEventArgs e) {
MyMenuItem.RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left) {
RoutedEvent = Mouse.MouseUpEvent
});
}
我已经用.NET Reflector检查了代码,Steve是正确的。设置IsSubmenuOpen会使名为MenuMode的内部变量处于中间状态。最终的效果是,菜单仍然具有焦点,将鼠标悬停在顶级菜单标题上会导致出现下拉菜单。似乎发送MouseUp事件将正确重置菜单控件维护的内部状态。
private void button_Click(object sender, RoutedEventArgs e) {
Button b = sender as Button;
if (b == null || !(b.Parent is MenuItem))
return;
MenuItem mi = b.Parent as MenuItem;
mi.RaiseEvent(
new MouseButtonEventArgs(
Mouse.PrimaryDevice, 0, MouseButton.Left
)
{RoutedEvent=Mouse.MouseUpEvent}
);
}
private void Button_Click(object sender, RoutedEventArgs e) {
MyMenuItem.RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left) {
RoutedEvent = Mouse.MouseUpEvent
});
}