启动外部进程后,WPF ContextMenu仍然可见

Dan*_*lba 6 .net c# wpf contextmenu

我正在从ContextMenu启动外部应用程序,我必须在目标应用程序运行时阻止源应用程序.为实现这一点,我Process.WaitForExit()用来避免源应用程序响应事件.

问题是上下文菜单仍然领先于目标应用程序.让我们看一个简单的例子:

在此输入图像描述

这是我用于示例的代码.

    public MainWindow()
    {
        InitializeComponent();

        this.ContextMenu = new ContextMenu();

        MenuItem menuItem1 = new MenuItem();
        menuItem1.Header = "Launch notepad";
        menuItem1.Click += MyMenuItem_Click;
        this.ContextMenu.Items.Add(menuItem1);
    }

    void MyMenuItem_Click(object sender, RoutedEventArgs e)
    {
        Process p = new Process();
        p.StartInfo.FileName = "notepad.exe";
        p.StartInfo.CreateNoWindow = false;
        p.Start();
        p.WaitForExit();
        p.Close();
    }
Run Code Online (Sandbox Code Playgroud)

如何在显示目标应用程序之前使ContextMenu消失?

Dan*_*lba 1

基于Jcl给出的伟大想法...

我找到了一个使用自定义菜单项的简单解决方案。它会延迟MenuItem.Click()事件直到父级ContextMenu关闭。

class MyMenuItem : MenuItem
{
    protected override void OnClick()
    {
        ContextMenu parentContextMenu = Parent as ContextMenu;
        parentContextMenu.Closed += ContextMenu_Closed;
        parentContextMenu.IsOpen = false;
    }

    void ContextMenu_Closed(object sender, RoutedEventArgs e)
    {
        ContextMenu parent = Parent as ContextMenu;
        parent.Closed -= ContextMenu_Closed;
        base.OnClick();
    }
}
Run Code Online (Sandbox Code Playgroud)