c# - ToolStripDropDownMenu 在表单最小化和恢复后保持打开状态

标签 c# .net winforms

我有 Window Forms 应用程序,我正在使用 ToolStripDropDown 作为我的表单的上下文菜单。

public partial class Form1 : Form
{
    ToolStripDropDownMenu _formContextMenu = null;        

    public Form1()
    {
        InitializeComponent();
        _formContextMenu = new ToolStripDropDownMenu();
        _formContextMenu.Items.Add("Item1");
        _formContextMenu.Items.Add("Item2");
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            _formContextMenu.Show(e.Location);
        }
        else
            base.OnMouseDown(e);
    }

    protected override void OnResize(EventArgs e)
    {
        _formContextMenu.Close();
        base.OnResize(e);
    }
}

首先,我使用鼠标右键单击表单以显示上下文菜单。之后,我按 Win+D(最小化所有窗口),然后再次打开我的应用程序。上下文菜单保持打开状态,并且在我单击表单时也不会关闭。我什至可以将表格移动到其他地方,但它仍将保持打开状态。 我也尝试过以不同的原因关闭它。

    _formContextMenu.Close(ToolStripDropDownCloseReason.AppClicked);
    _formContextMenu.Close(ToolStripDropDownCloseReason.AppFocusChange);
    _formContextMenu.Close(ToolStripDropDownCloseReason.CloseCalled);
    _formContextMenu.Close(ToolStripDropDownCloseReason.ItemClicked);
    _formContextMenu.Close(ToolStripDropDownCloseReason.Keyboard);

没有帮助。 有人可以帮助解决这个问题吗?

最佳答案

我使用了这个解决方法来解决这个问题并且它工作正常:

protected override void OnSizeChanged(EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        //_formContextMenu or this.contextMenuStrip1

        this.contextMenuStrip1.Visible = true; 
        this.contextMenuStrip1.Close();
    }
    base.OnSizeChanged(e);
}

虽然 ContextMenuStrip 也会出现此问题,但如果没有使用 ToolStripDropDownMenu 的特定目标,您可以使用 ContextMenuStrip 组件并设置 ContextMenuStrip 窗体的属性。这样您就不需要编写代码来显示上下文菜单。

但如果出于任何原因您更喜欢在代码中显示,请考虑以这种方式显示上下文菜单/下拉菜单:yourContextMenu.Show(this,e.Location);

关于c# - ToolStripDropDownMenu 在表单最小化和恢复后保持打开状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34022236/

相关文章:

c# - 从 PDF 转换为 HTML

c# - 缺少命名空间或程序集引用时出错

c# - Windows 窗体中检查 DrawItemState 等效性的条件表达式的含义是什么?

c# - 用于更新 WinForms UI 的 BackgroundWorker 线程

c# - File.WriteAllBytes 在映射网络驱动器上完成后的文件大小

c# - 加快构建时间的方法? (C#/非托管 C++)

c# - Linq lambda 用于在列表中搜索列表,找到匹配项,然后将其从列表中删除

c# - 在列表框 Windows Phone 8 中启用虚拟化

c# - .NET Core 中的 NLog 事件属性

c#循环遍历组合框,其中数据源是带有文本的数据表