我正在使用MenuStrip遇到一些非常奇怪的行为:
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()
。
答案 0 :(得分:2)
这不是一个错误。 这是一项功能。
实际上,在DropDownItemClicked
事件处理程序中执行代码后,下拉菜单将自动隐藏。但是,您使用某种MessageBox
或ShowDialog
来阻止当前执行并挂起下拉菜单。
至少有两种解决方案可以解决这个问题,一种是在显示对话框之前自己隐藏菜单(这似乎是你采用的)。另一个解决方案是使用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()
。