9

我在 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>

谢谢,乔恩

4

3 回答 3

13

抓住MenuItem并做:

_menuItem.IsSubmenuOpen = false;

获取它的简单方法:

<Button x:Name="_button" Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MenuItem}, AncestorLevel=2}"/>

代码隐藏:

_button.Click += delegate
{
    (_button.Tag as MenuItem).IsSubmenuOpen = false;
};
于 2009-04-23T15:11:37.550 回答
4

我发现 usingIsSubmenuOpen并不能正确地从包含的菜单中消除焦点(特别是如果菜单位于工具栏中 -即使菜单“关闭” 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}
           );
        }
于 2012-03-07T11:43:57.177 回答
2

史蒂夫感谢您的解决方案。这实际上是正确的答案,最后是除了互联网上大量错误答案之外真正有效的东西。根据您的 anwser,我有一个更短(更安全)的解决方案。因为按钮的直接父级(e.Parent)并不总是 MenuItem(来自 StackPanel 的原始答案),所以您的解决方案将不起作用。因此,只需设置 MenuItem 的 Name 属性 (Name="MyMenuItem") 并将此处理程序挂接到 Button 上:

    private void Button_Click(object sender, RoutedEventArgs e) {
        MyMenuItem.RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left) {
            RoutedEvent = Mouse.MouseUpEvent
        });
    }
于 2016-08-11T00:11:25.967 回答