2013-01-04 1 views
1

J'ai un problème assez étrange mais reproductible. J'ai un MenuStrip qui peut ouvrir un nouveau formulaire Modeless avec la méthode Form.Show().Le formulaire parent est mis en avant lorsque l'on clique sur la barre de menu d'un formulaire enfant

La forme enfant possède également une barre de menu.

Les choses étranges se produit lorsque vous démarrez en cliquant sur la bande de menu de la forme de l'enfant. Ensuite, le formulaire parent revient au premier plan et dit bonjour. C'est une vraie douleur.

Comment éviter ce problème?

Un film Scorcese pour illustrer mon problème en suivant ce lien zippyshare.com (3Mo)

Comme vous pouvez le voir dans la vidéo, la forme mère ne prend pas le focus, il est juste devant bringed par somehing autre.

Notez que repacing la MenuStrip par un ToolStrip corriger le problème.

code pour reproduire le problème:

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

Il semble que votre formulaire génère une nouvelle instance de lui-même. Cela pourrait causer beaucoup de problèmes. Mieux engendrer une instance de quelque chose d'autre. –

+0

Je ne vois pas quel genre de problème cela pourrait faire. Avez-vous un exemple? –

+0

Non, je n'ai pas d'exemple. Si je l'ai fait, j'aurais écrit une réponse, pas un commentaire. Mais vous avez deux formes sans parent nommées identiques contenant des contrôles nommés de manière identique. Je soupçonnerais que c'est le problème avant que je suspecte quoi que ce soit d'autre. –

Répondre

4

Ceci est un bug assez méchant qui a été introduit dans 4,5 .NET. L'article de la base de connaissances est available here. Le correctif est actuellement disponible uniquement en tant que correctif, espérons qu'il sera bientôt disponible dans une mise à jour de service. Je vais simplement copier/coller la description:

Supposons que vous disposez d'une application Windows Form .NET Framework 4.5. Lorsque vous cliquez sur un élément de menu pour ouvrir une fenêtre enfant dans l'application, les interactions avec le menu et la fenêtre enfant se comportent de manière incorrecte.

Par exemple, vous pouvez rencontrer les éléments suivants:

Lorsque vous ouvrez un menu contextuel dans la fenêtre de l'enfant, la fenêtre principale prend la mise au point.
Vous ne pouvez pas utiliser de mnémoniques pour accéder à un élément de menu.

Ce problème se produit car l'interface IMessageFilter est décrocha trop agressive. Par conséquent, .NET Framework 4.5 ne filtre pas les messages de fenêtre liés au menu.


Mise à jour: ce problème a été résolu dans une mise à jour 4.5 .NET publié le 8 janvier 2013. L'article KB is here.

+0

Ok, donc j'ai perdu contre le framework, je vais juste utiliser une ToolStrip! –

+0

Malheureusement, le correctif fonctionne uniquement sur Windows 8, pas sur Windows 7 jusqu'à présent: - / – Vyktor

Questions connexes