12
votes

Le problème avec NOTIFYICON ne disparaît pas sur l'application WinForms

J'ai une application .NET 3.5 C # WinForms. Il n'y a pas d'interface graphique en tant que telle, juste un notificon avec un contextMenu.

J'ai essayé de définir le notificon à visible = Faux et jetez-le dans l'événement Application_exit, comme suit: P>

private void CheckForUpdate()
{
    EventLogger.Instance.LogEvent("Checking for Update");
    if (ApplicationDeployment.IsNetworkDeployed && ApplicationDeployment.CurrentDeployment.CheckForUpdate())
    {
        EventLogger.Instance.LogEvent("Update available - updating");
        ApplicationDeployment.CurrentDeployment.Update();
        Application.Restart();
    }
}


0 commentaires

7 Réponses :


3
votes

Ce code fonctionne pour moi, mais je ne sais pas comment vous gardez votre application en vie, alors ... sans autre ado: xxx


0 commentaires

0
votes

Parfois, l'événement Application_Exit peut être soulevé plusieurs fois Juste mettre notificon = null; à la fin xxx


2 commentaires

En fait, maintenant que je pense à cela, je recommanderais d'utiliser cet événement pour cela, car il est possible d'avoir plusieurs boucles d'application.Run () en cours sur différents threads et ils déclencheront tous un événement de sortie pouvant faire disparaître votre icône. prématurément.


Totalement d'accord avec toi! Je préfère ne pas utiliser cet événement dans mes applications à des fins de nettoyage. Cependant, c'est la réponse la plus simple à la question "Pourquoi ce code jette une exception". Quant à mes idées Comment concevoir ce code d'une autre manière, je pourrais proposer de créer une classe jetable enveloppe autour de notificon, de sorte qu'il contrôlera la durée de vie du notificon. puis écrire en utilisant (nouvelle notificoncontroller ()) {application.run ()}; ou quelque chose comme ça



3
votes

C'est ce que je fais dans WPF.

J'utilise ceci en conjonction à David Anson's minimiser l'application exemple de bac , ce qui vous permet de connecter une icône de bac à une fenêtre (vous Peut avoir plusieurs fenêtres ouvertes).

Il suffit d'ajouter ce code au constructeur pour minimisetotrayinstance . xxx


2 commentaires

Sur la fenêtre Fermer l'événement, cela a fonctionné pour moi. Sur App_exit, il jette une erreur lors de la mise en disposition de notificon.


juste envelopper dans un essais attraper et ignorer l'exception



12
votes

Sous Windows 7, je devais également définir la propriété icon sur NULL. Sinon, l'icône est restée dans la fenêtre "Icônes cachées" du plateau après la fermeture de l'application. HTH quelqu'un.

// put this inside the window's class constructor
Application.ApplicationExit += new EventHandler(this.OnApplicationExit);


        private void OnApplicationExit(object sender, EventArgs e)
        {

            try
            {
                if (trayIcon != null)
                {
                    trayIcon.Visible = false;
                    trayIcon.Icon = null; // required to make icon disappear
                    trayIcon.Dispose();
                    trayIcon = null;
                }

            }
            catch (Exception ex)
            {
                // handle the error
            }
        }


0 commentaires

0
votes

Avez-vous remplacé la méthode d'élimination de l'objet où vous avez initialisé le notificon pour éliminer également le notificon?

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        notifyIcon.Dispose();
        notifyIcon = null;
    }
    base.Dispose(disposing);
}


0 commentaires

0
votes

Ce code a fonctionné pour moi xxx


0 commentaires

0
votes

Avant je suis désolé pour mon mauvais anglais. Si vous utilisez "fin" pour le programme de sortie. Ensuite, ne fermez pas l'icône de notification. Avant que vous fermez le notificon ultérieurement proche de la forme. vous devez utiliser moi.close () pour la fermeture de formulaire d'exécution

exemple Son travail ... xxx

mais sa ne fonctionne pas xxx

ou uniquement xxx < / pré>


0 commentaires