gpt4 book ai didi

c# - 单击项目后 MenuStrip 不隐藏。漏洞?

转载 作者:行者123 更新时间:2023-11-30 16:15:54 26 4
gpt4 key购买 nike

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

  1. 创建一个新的 WinForms 项目(.net 4.0。C# 或 VB.NET 无关紧要;我使用的是 C#)。
  2. 在默认窗体上放置一个MenuStrip。右键单击并选择插入标准项目 以快速为您构建它。此步骤也可以手动完成。
  3. 同时将 OpenFileDialog 拖放到您的表单上。
  4. 为"file"菜单的 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 将阻止当前执行并将下拉菜单卡在那里。

至少有两种解决方案供您解决,一种是在显示对话框之前自己隐藏菜单(这似乎被您采用了)。另一种解决方案是使用 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 事件处理程序中手动隐藏下拉菜单,您可以使用e.ClickedItem.Owner .Hide() 而不是 FileToolStripMenuItem.HideDropDown()

关于c# - 单击项目后 MenuStrip 不隐藏。漏洞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19069481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com