有没有办法以编程方式关闭WPF中的menuitem

Jon*_*agh 8 wpf menu menuitem

我在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>
Run Code Online (Sandbox Code Playgroud)

谢谢,乔恩

Ken*_*art 12

掌握MenuItem并做到:

_menuItem.IsSubmenuOpen = false;
Run Code Online (Sandbox Code Playgroud)

轻松掌握它:

<Button x:Name="_button" Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MenuItem}, AncestorLevel=2}"/>
Run Code Online (Sandbox Code Playgroud)

代码隐藏:

_button.Click += delegate
{
    (_button.Tag as MenuItem).IsSubmenuOpen = false;
};
Run Code Online (Sandbox Code Playgroud)


小智 5

我发现使用IsSubmenuOpen并不能正确消除包含菜单的焦点(特别是如果菜单位于工具栏中 -即使菜单“关闭”,MenuItem顶层MenuItem仍然保留)。Selected我发现发送MouseUp事件到MenuItem效果更好(在按钮或嵌套控件的 Click 事件处理程序中):

        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}
           );
        }
Run Code Online (Sandbox Code Playgroud)

  • 我已经使用 .NET Reflector 浏览了代码,Steve 是正确的。设置 IsSubmenuOpen 会使名为 MenuMode 的内部变量处于中间状态。最终效果是菜单仍然具有焦点,并且将鼠标悬停在顶级菜单标题上将导致出现下拉菜单。看来发送 MouseUp 事件将正确重置菜单控件所维护的内部状态。 (2认同)