【问题标题】:Button in contextMenu menuItemcontextMenu menuItem 中的按钮
【发布时间】:2017-03-13 21:11:33
【问题描述】:

我有一个问题 - 在后面的代码中我添加了MenuItems 的集合,其中一个有一个StackPanel 作为它的Header。在StackPanel 中有一个Button 应该关闭整个ContextMenu,但不幸的是它没有。任何帮助将不胜感激。

代码示例:

var itemB = new MenuItem();
var stackPanel = new StackPanel() { Orientation = Orientation.Horizontal };
var textBox = new TextBox() { Width = 60 };
var button = new Button() { Content = "Ok", Width = 60 };
stackPanel.Children.Add(textBox);
stackPanel.Children.Add(button);
itemB.Header = stackPanel;

//1st approach - doesn't work, I can only get access to MenuItem Header
button.Click += (sender, e) =>
{
    FrameworkElement fe = sender as FrameworkElement;
    while (fe != null)
    {
        if (fe is ContextMenu)
        {
            (fe as ContextMenu).IsOpen = false;
            break;
        }
        fe = fe.Parent as FrameworkElement;
    }
};

//2nd approach - doesn't work, I can only get access to MenuItem Header
itemB.PreviewMouseUp += (sender, e) =>
{
    ((MenuItem)((MenuItem)sender).Parent).IsSubmenuOpen = false;
};

我找到了类似的文章,但没有成功:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/17603d7e-b76b-45b5-a2df-2f3b378b690c/force-button-inside-contextmenu-to-close-contextmenu?forum=wpf

WPF: button inside MenuItem, closing the menu

Is there a way to programatically close a menuitem in WPF

【问题讨论】:

  • 有什么消息吗?我已经发布了答案,我想知道它是否适合您,或者您是否找到了其他解决方案。
  • @Massimiliano 嗨!谢谢你的回答。这种方式可以工作,但在我的情况下,ContextMenu 是在 xaml 中定义的,如果可能的话它应该留在那里。

标签: wpf menu contextmenu


【解决方案1】:

您说ContextMenu 是在 XAML 上定义的,所以我们假设这样的代码:

<Grid>
  <Grid.ContextMenu>
    <!-- ContextMenu with a Name to be called! -->
    <ContextMenu Name="GridContextMenu"/>
  </Grid.ContextMenu>
  <Button Content="Open Menu" Click="Button_Click"/>
  <!-- other controls ... -->
</Grid>

让我们实现点击事件:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var textBox = new TextBox { Width = 60 };

    var button = new Button { Content = "Ok", Width = 60 };

    var stackPanel = new StackPanel
    {
        Orientation = Orientation.Horizontal,
        Children = { textBox, button },
    };

    var menuItem = new MenuItem
    {
        Header = stackPanel,
    };

    button.Click += (s, args) =>
    {
        GridContextMenu.IsOpen = false;
        GridContextMenu.Items.Remove(menuItem);
    };

    GridContextMenu.Items.Add(menuItem);

    GridContextMenu.IsOpen = true;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    相关资源
    最近更新 更多