我在使用MenuStrip时遇到了一些非常奇怪的行为:
- 创建一个新的 WinForms 项目 (.net 4.0.C# 或 VB.NET 无关紧要;我使用了 C#(。
- 在默认窗体上放置一个
MenuStrip
。右键单击并选择"插入标准项">以快速为您构建它。此步骤也可以手动完成。 - 在表单上也放一个
OpenFileDialog
。 -
为"文件"菜单
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); } }
-
运行项目。单击"文件"菜单,然后单击"打开"命令。此时将显示文件对话框,但">文件"菜单不会消失。事实上,它画在
OpenFileDialog
之上,隐藏了它的一部分。在对话框中单击">打开"或"取消"后,对话框和"文件">菜单都将消失。
为什么会这样?这是一个已知的错误或功能吗?我还检查了我的对话框不会发生这种情况,而只会针对内置对话框。在显示内置对话框之前,必须手动调用FileToolStripMenuItem.HideDropDown()
。
一个错误。这是一个功能。
实际上,在DropDownItemClicked
事件处理程序中执行代码后,下拉菜单将自动隐藏。但是,您使用某种MessageBox
或ShowDialog
,这将阻止当前执行并在那里挂起下拉菜单。
至少有 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()
。