c# - 以编程方式打开上下文菜单时如何引发 ContextMenuOpening 事件

标签 c# wpf wpf-controls contextmenu

当我使用 <control>.ContextMenu.IsOpen = true 打开上下文菜单时, 上下文菜单变为可见但打开或关闭事件均未触发。

我怎样才能确保 ContextMenuOpeningContextMenuClosing当我以编程方式打开上下文菜单时会引发事件?


演示:

看下面的XAML

<Button Name="ContextMenuButton" 
        Content="Click me!" 
        Click="ContextMenuButton_Click" 
        ContextMenuOpening="ContextMenuButton_OnContextMenuOpening"
        ContextMenuClosing="ContextMenuButton_OnContextMenuClosing">
    <Button.ContextMenu>
        <ContextMenu>
            <MenuItem Header="First element" />
            <MenuItem Header="Second element" />
        </ContextMenu>
    </Button.ContextMenu>
</Button>

以及下面的代码隐藏

public MainWindow() // Constructor
{
    InitializeComponent();
    ContextMenuButton.ContextMenuOpening += (sender, args) => Debug.Print("Opening #2");
    ContextMenuButton.ContextMenuClosing += (sender, args) => Debug.Print("Closing #2");
}

private void ContextMenuButton_Click(object sender, RoutedEventArgs e)
{
    Button button = (sender as Button);
    button.ContextMenu.IsOpen = true; // How should I open the ContextMenu?
}

private void ContextMenuButton_OnContextMenuOpening(object sender, ContextMenuEventArgs e)
{
    Debug.Print("Opening #1");
}

private void ContextMenuButton_OnContextMenuClosing(object sender, ContextMenuEventArgs e)
{
    Debug.Print("Closing #1");
}

右键单击按钮时的行为:

上下文菜单正在打开。

输出是:

Opening #1
Opening #2
Closing #1
Closing #2

左键单击按钮时的行为:

上下文菜单正在打开。

输出是:

<Nothing>

最佳答案

问题是您已经在 Button 的 ContextMenuOpening 上附加了事件,并且由于您是手动调用 ContextMenu,所以事件没有触发

所以要从 ContextMenu 中附加 Opened 和 Closed 事件来获取事件

    public MainWindow() // Constructor
    {
        InitializeComponent();
        ContextMenuButton.ContextMenu.Opened += (sender, args) => Debug.Print("Opening #2");
        ContextMenuButton.ContextMenu.Closed += (sender, args) => Debug.Print("Closing #2");
    }

xaml

    <Button Name="ContextMenuButton" 
            Content="Click me!" 
            Click="ContextMenuButton_Click" >
        <Button.ContextMenu>
            <ContextMenu Opened="ContextMenuButton_OnContextMenuOpening" Closed="ContextMenuButton_OnContextMenuClosing">
                <MenuItem Header="First element" />
                <MenuItem Header="Second element" />
            </ContextMenu>
        </Button.ContextMenu>
    </Button>

事件,ContextMenuEventArgs 改为 RoutedEventArgs

    private void ContextMenuButton_OnContextMenuOpening(object sender, RoutedEventArgs e)
    {
        Debug.Print("Opening #1");
    }

    private void ContextMenuButton_OnContextMenuClosing(object sender, RoutedEventArgs e)
    {
        Debug.Print("Closing #1");
    }

按钮点击保持不变。

这应该可以解决您的问题

关于c# - 以编程方式打开上下文菜单时如何引发 ContextMenuOpening 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24083786/

相关文章:

c# - 如何检查 5 个整数中的 3 个是否相同

c# - 将 ZPL 字符串转换为 JPG 图像和 PDF

HashSet<List<float>> 上的 C# SetEquals 当预期为 true 时为 false

wpf - 带有 DataTemplate 的 WPF 可编辑组合框的 SelectedItem 问题

wpf - 更改 MouseOver 上 MenuItem 的背景颜色

c# - WIndows 8.1 应用程序中缺少 System.Environment 定义

wpf - 是否可以使用 WPF 主题为可以在运行时更改的应用程序包含多个皮肤?

.net - 来自作为字符串的友好名称的 WPF 颜色

wpf - 如何通过可视化树从 ContextMenu menuitem 访问控件?

wpf - MouseLeftButtonDown 没有被解雇