2016-11-28 2 views
1

J'ai une application WinForms contenant un ToolStrip avec ToolStripButtons. Certaines actions du bouton désactivent le formulaire principal pendant que l'action du bouton a lieu et le réactivent une fois terminé. Ceci est fait pour s'assurer que l'utilisateur ne clique pas sur d'autres endroits pendant que l'action a lieu, et montre également un WaitCursor mais ce n'est pas pertinent au problème.ToolStripButton toujours en surbrillance lorsque le formulaire est désactivé/activé

Si l'utilisateur clique sur le bouton et déplace le curseur de la souris en dehors de ses limites alors que le formulaire est désactivé, le bouton reste en surbrillance (bleu transparent) même lors de la réactivation du formulaire ultérieurement. Si la souris entre/quitte le bouton après, il s'affiche à nouveau correctement.

Je pourrais répliquer artificiellement le problème en affichant un MessageBox en utilisant le code suivant (l'action réelle n'affiche pas de boîte de message, mais ouvre un nouveau formulaire et remplit une grille, mais l'effet net est le même).

Voici un extrait de code pour reproduire le problème:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void toolStripButton1_Click(object sender, EventArgs e) 
    { 
     // Disable the form 
     Enabled = false; 

     // Some action where the user moved the mouse cursor to a different location 
     MessageBox.Show(this, "Message"); 

     // Re-enable the form 
     Enabled= true; 
    } 
} 
+0

Avez-vous essayez d'ajouter 'this.Refresh();' en tant que première ligne dans 'toolStripButton1_Click'? – ispiro

+0

J'ai maintenant essayé votre code et l'arrière-plan bleu disparaît lorsque je ferme le MessageBox. – ispiro

+0

@ispiro Essayé avec 'this.Refresh();' mais le problème persiste. Peut-être que vous avez fermé le MessageBox avec Enter au lieu de cliquer avec la souris? Je ne sais pas si c'est pertinent, mais j'utilise Visual Studio 2013 et .NET Framework 4.5. – Andres

Répondre

2

J'ai finalement trouvé une solution.

J'ai créé cette méthode d'extension qui utilise la réflexion pour appeler la méthode privée « ClearAllSelections » sur la toolstrip mère:

public static void ClearAllSelections(this ToolStrip toolStrip) 
    { 
     // Call private method using reflection 
     MethodInfo method = typeof(ToolStrip).GetMethod("ClearAllSelections", BindingFlags.NonPublic | BindingFlags.Instance); 
     method.Invoke(toolStrip, null); 
    } 

et l'appeler après réactivant la forme:

private void toolStripButton1_Click(object sender, EventArgs e) 
{ 
    // Disable the form 
    Enabled = false; 

    // Some action where the user moved the mouse cursor to a different location 
    MessageBox.Show(this, "Message"); 

    // Re-enable the form 
    Enabled= true; 

    // Hack to clear the button highlight 
    toolStrip1.ClearAllSelections(); 
}