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

时间:2009-04-23 14:52:10

标签: 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>

谢谢, 乔恩

3 个答案:

答案 0 :(得分:12)

抓住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;
};

答案 1 :(得分:4)

我发现使用IsSubmenuOpen无法正确消除包含MenuItem的菜单中的焦点(特别是如果菜单位于工具栏中 - 顶级MenuItem仍为{{ 1}}即使菜单是“已关闭”)。我发现向Selected发送MouseUp事件效果更好(在按钮或嵌套控件的Click事件处理程序中):

MenuItem

答案 2 :(得分: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
        });
    }