单击一个项目后,MenuStrip不会隐藏。错误?

时间:2013-09-28 17:05:03

标签: c# .net vb.net winforms menustrip

我正在使用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之上绘制,隐藏了它的一部分。在对话框中单击打开取消后,对话框和文件菜单都将消失。

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

1 个答案:

答案 0 :(得分:2)

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

实际上,在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()