3

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

  1. 创建一个新的 WinForms 项目(.net 4.0。C# 或 VB.NET 无关紧要;我使用的是 C#)。
  2. 将 aMenuStrip放在默认表单上。右键单击并选择插入标准项目以快速为您构建它。此步骤也可以手动完成。
  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()在显示内置对话框之前手动调用。

4

1 回答 1

3

这不是一个错误。这是一个功能

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

至少有两种解决方案可以解决这个问题,一种是在显示对话框之前自己隐藏菜单(这似乎被你采用了)。另一种解决方案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);
    }));
  }
}

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

于 2013-09-28T17:26:28.070 回答