Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以通过编程方式关闭WPF中的菜单项_Wpf_Menu_Menuitem - Fatal编程技术网

有没有一种方法可以通过编程方式关闭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">

我在wpf中有一个菜单,上面有一个输入框和一个按钮。一旦用户点击按钮,我需要关闭菜单

有办法做到这一点吗

    <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
        });
    }