单击项目后不隐藏菜单条.错误



我在使用MenuStrip时遇到了一些非常奇怪的行为:

  1. 创建一个新的 WinForms 项目 (.net 4.0.C# 或 VB.NET 无关紧要;我使用了 C#(。
  2. 在默认窗体上放置一个MenuStrip。右键单击并选择"插入标准项">以快速为您构建它。此步骤也可以手动完成。
  3. 在表单上也放一个OpenFileDialog
  4. 为"文件"菜单DropDownItemClicked事件添加事件处理程序。将以下代码添加到其中:

    private void fileToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
    {
        if (e.ClickedItem.Name == "openToolStripMenuItem")
        {
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                MessageBox.Show(openFileDialog1.FileName);
        }
    }
    
  5. 运行项目。单击"文件"菜单,然后单击"打开"命令。此时将显示文件对话框,但">文件"菜单不会消失。事实上,它画在OpenFileDialog之上,隐藏了它的一部分。在对话框中单击">打开"或"取消"后,对话框和"文件">菜单都将消失。

为什么会这样?这是一个已知的错误或功能吗?我还检查了我的对话框不会发生这种情况,而只会针对内置对话框。在显示内置对话框之前,必须手动调用FileToolStripMenuItem.HideDropDown()

这不是

一个错误。这是一个功能

实际上,在DropDownItemClicked事件处理程序中执行代码后,下拉菜单将自动隐藏。但是,您使用某种MessageBoxShowDialog,这将阻止当前执行并在那里挂起下拉菜单。

至少有 2 种解决方案可以解决此问题,一种是在显示对话框之前自己隐藏菜单(这似乎已被您采用(。另一种解决方案是使用 BeginInvoke 来显示您的对话框,async调用不会阻止当前执行,并且下拉菜单将被预期隐藏:

private void fileToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e){
  if (e.ClickedItem.Name == "openToolStripMenuItem")
  {
    BeginInvoke((Action)(()=>{
        if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
          MessageBox.Show(openFileDialog1.FileName);
    }));
  }
}

注意:要在 DropDownItemClicked 事件处理程序中手动隐藏drop down menu,可以使用 e.ClickedItem.Owner.Hide() 而不是 FileToolStripMenuItem.HideDropDown()

相关内容

  • 没有找到相关文章

最新更新