2009-04-19 6 views
1

J'ai une icône de plateau de coquille avec un menu contextuel joint. Le problème que j'ai est qu'appeler ShowDialog() à partir d'un gestionnaire de Clicked menu contextuel ne résulte pas dans un dialogue modal.Comment créer des boîtes de dialogue modales à partir du menu contextuel NotifyIcon?

Il est facile de reproduire ceci avec un projet C# par défaut. Il suffit d'ajouter le code suivant au fichier Form1.cs:

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 

    ToolStripMenuItem contextMenuShowMsg = new System.Windows.Forms.ToolStripMenuItem(); 
    contextMenuShowMsg.Name = "contextMenuShowMsg"; 
    contextMenuShowMsg.Text = "Show MessageBox..."; 
    contextMenuShowMsg.Click += new System.EventHandler(this.contextMenuShowMsg_Click); 

    ContextMenuStrip contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); 
    contextMenuStrip.Items.Add(contextMenuShowMsg); 

    NotifyIcon notifyIcon = new NotifyIcon(); 
    notifyIcon.Text = "DlgTest"; 
    notifyIcon.Icon = SystemIcons.Application; 
    notifyIcon.Visible = true; 
    notifyIcon.ContextMenuStrip = contextMenuStrip; 
} 

private void contextMenuShowMsg_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show(this, "Test MessageBox"); 
} 

Si vous construisez et exécutez cela, vous serez en mesure d'obtenir deux boîtes de message sur l'écran en choisissant simplement l'option du menu contextuel deux fois. Cela ne devrait-il pas être modal? Remplacer cela par un appel à ShowDialog() pour un autre formulaire entraîne le même comportement non modal.

Ma meilleure estimation est que le NotifyIcon n'est pas spécifiquement lié au formulaire, comme il le serait dans une application Windows typique. Mais je ne vois aucun moyen de le faire.

Des idées? Merci d'avance pour votre aide!

Répondre

0

Je vous conseille de faire deux choses avant que vous essayez d'afficher une boîte de message modal:

  1. Faire propriétaire-fenêtre de votre icône visible.
  2. Donnez-lui le focus.

Une fois que vous avez fait cela, le this dans le MessageBox.Show devient un "parent de modalité" légal.

Heck, il est même plus logique que la boîte de message s'affiche au-dessus de tout programme généré, non? De cette façon, l'utilisateur a un peu de contexte pour ce que la boîte de message est sur!

+0

Il y a toutes sortes de raisons pour lesquelles vous pourriez vouloir une icône de la barre d'état système soutenue par une fenêtre cachée - Je parie que vous en avez plus d'un dans votre barre d'état système. Le problème est que cela est généralement géré par Windows pour vous, puisque vous associez une fenêtre (formulaire) avec l'icône du shell dans l'appel de l'API Shell_NotifyIcon. La modalité est ensuite appliquée. Dans .NET, je ne vois aucun moyen d'associer un formulaire à NotifyIcon. –

+1

Une boîte de dialogue modale est simplement une boîte de dialogue qui empêche le déplacement du focus vers une autre fenêtre de l'application. Si votre fenêtre est cachée, cela n'a aucun sens. Essayez-vous de créer une boîte de dialogue "modale à l'échelle du système"? Quelque chose qui empêche l'utilisateur de faire quoi que ce soit d'autre jusqu'à ce qu'il s'occupe de la boîte de dialogue? – scraimer

0

Vous devrez suivre les activations du menu de la barre d'état système et les désactiver lorsqu'une boîte de dialogue est ouverte.

Questions connexes