2013-01-04 89 views
1

我有一個很奇怪但可複製的問題。父窗體在點擊子窗體的菜單條時點擊前

我有一個MenuStrip它可以用Form.Show()方法打開一個新的無模式窗體。

子窗體也有菜單條。

當您通過單擊子窗體的菜單條開始時會發生奇怪的事情。然後,父母形式回到前臺並打招呼。這是一個真正的痛苦。

如何防止此問題?

一個史科瑟思電影通過以下鏈接zippyshare.com(3MO)

正如你可以看到在視頻,父窗體並不需要重點說明我的問題,它只是通過其他somehing前bringed。

請注意,將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(); 
    } 
} 
+0

看起來你的表單正在產生一個新的自己的實例。這可能會導致很多問題。更好地產生別的東西的實例。 –

+0

我不明白這可以做什麼樣的問題。你有一個例子嗎? –

+0

不,我沒有一個例子。如果我這樣做了,我會寫一個答案,而不是一個評論。但是,您有兩個名稱相同的無主表單,其中包含相同名稱的控件。在懷疑其他事情之前,我會懷疑這是問題所在。 –

回答

4

這是一個被介紹在.NET 4.5一個非常討厭的錯誤。知識庫文章是available here。該修復程序現在只能作爲修補程序使用,希望它能儘快將它變成服務更新。我只是複製/粘貼說明:

假設你有一個基於4.5的.NET Framework Windows窗體應用程序。當您單擊某個菜單項以在應用程序中打開一個子窗口時,與該菜單和子窗口的交互行爲將錯誤。

例如,您可能會遇到以下情況:

當您打開子窗口上下文菜單,主窗口中把焦點。
您不能使用助記符來訪問菜單項。

出現此問題的原因是IMessageFilter接口太過於積極地解除了連接。因此,.NET Framework 4.5不會過濾與菜單相關的窗口消息。


更新:這個問題是固定在1月8發佈的.NET 4.5的更新,2013年的知識庫文章is here

+0

好吧,所以我失去了對框架,我只會使用ToolStrip! –

+0

不幸的是,補丁只能在Windows 8上運行,而不是Windows 7: - / – Vyktor