1

我有一个非常奇怪但可重现的问题。

我有一个MenuStrip可以使用该方法打开一个新的无模式表单Form.Show()

子窗体也有一个菜单条。

当您通过单击子窗体的菜单条开始时会发生奇怪的事情。然后父表单返回前台并打招呼。那是一个真正的痛苦。

如何预防这个问题?

通过点击此链接zippyshare.com (3Mo)的 Scorcese 电影来说明我的问题

正如您在视频中看到的那样,父表单没有获得焦点,它只是被其他东西带到了前面。

请注意,MenuStrip通过ToolStrip更正问题来解决问题。

重现问题的一些代码:

public class DemoLostfocus : Form
{
    private void InitializeComponent()
    {
        this.menuStrip1 = new MenuStrip();
        this.fileToolStripMenuItem = new ToolStripMenuItem();
        this.openModelessFormToolStripMenuItem = new ToolStripMenuItem();
        this.menuStrip1.SuspendLayout();
        this.SuspendLayout();

        this.menuStrip1.Items.AddRange(new ToolStripItem[] {
        this.fileToolStripMenuItem});
        this.menuStrip1.Location = new System.Drawing.Point(0, 0);
        this.menuStrip1.Name = "menuStrip1";
        this.menuStrip1.Size = new System.Drawing.Size(284, 24);
        this.menuStrip1.TabIndex = 0;
        this.menuStrip1.Text = "menuStrip1";

        this.fileToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] {
        this.openModelessFormToolStripMenuItem});
        this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
        this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
        this.fileToolStripMenuItem.Text = "File";

        this.openModelessFormToolStripMenuItem.Name = "openModelessFormToolStripMenuItem";
        this.openModelessFormToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
        this.openModelessFormToolStripMenuItem.Text = "Open Modeless Form";
        this.openModelessFormToolStripMenuItem.Click += new System.EventHandler(this.openModelessFormToolStripMenuItem_Click);

        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(284, 262);
        this.Controls.Add(this.menuStrip1);
        this.MainMenuStrip = this.menuStrip1;
        this.Name = "DemoLostfocus";
        this.Text = "DemoLostfocus";
        this.menuStrip1.ResumeLayout(false);
        this.menuStrip1.PerformLayout();
        this.ResumeLayout(false);
        this.PerformLayout();
    }

    private MenuStrip menuStrip1;
    private ToolStripMenuItem fileToolStripMenuItem;
    private ToolStripMenuItem openModelessFormToolStripMenuItem;

    public DemoLostfocus()
    {
        InitializeComponent();
    }

    private void openModelessFormToolStripMenuItem_Click(object sender, EventArgs e)
    {
        (new DemoLostfocus()).Show();
    }
}
4

1 回答 1

4

这是 .NET 4.5 中引入的一个非常讨厌的错误。知识库文章可在此处获得。该修复程序目前仅作为修补程序提供,希望它很快会成为服务更新。我将复制/粘贴描述:

假设您有一个基于 .NET Framework 4.5 的 Windows 窗体应用程序。当您单击菜单项以在应用程序中打开子窗口时,与菜单和子窗口的交互行为不正确。

例如,您可能会遇到以下情况:

当您在子窗口中打开上下文菜单时,主窗口将获得焦点。
您不能使用助记符访问菜单项。

出现此问题的原因是 IMessageFilter 接口过于激进地脱钩。因此,.NET Framework 4.5 不会过滤与菜单相关的窗口消息。


更新:此问题已在 2013 年 1 月 8 日发布的 .NET 4.5 更新中得到修复。知识库文章在此处

于 2013-01-04T16:08:39.593 回答