166 votes

Application WPF qui n'a qu'une icône dans la barre des tâches

Je suis totalement novice en matière de WPF et je me demande si quelqu'un pourrait me donner quelques indications sur la manière d'écrire une application qui démarre en étant réduite à la barre des tâches. L'idée est de récupérer périodiquement un flux RSS et de créer un Toaster-Popup lorsqu'il y a de nouveaux flux.

L'application devrait toujours avoir une fenêtre principale (essentiellement juste une liste contenant toutes les entrées de flux), mais elle devrait être cachée par défaut.

J'ai commencé à lire sur XAML et WPF et je sais que le StartupUri dans App.xaml doit pointer vers ma fenêtre principale, mais je n'ai aucune idée de la manière correcte de faire l'icône SysTray et de cacher la fenêtre principale (cela signifie également que lorsque l'utilisateur réduit la fenêtre, elle doit être réduite dans la zone de notification, et non dans la barre des tâches).

Des conseils ?

127voto

Drew Noakes Points 69288

Il n'y a pas de NotifyIcon pour WPF.

Un de mes collègues a utilisé cette bibliothèque disponible gratuitement à bon escient :

4 votes

Une bibliothèque fantastique. J'ai hâte de l'utiliser !

2 votes

Drew, le lien semble être mort ici. Avez-vous un autre lien pour cette bibliothèque ? J'ai effectué une recherche rapide, mais je n'ai pas pu déterminer si les résultats concernaient le même projet.

0 votes

@BradLarson, le site semble être en panne ; mais de toute façon le projet est disponible en tant que paquet Nuget (voir la réponse de Dale).

113voto

Shaun Wilson Points 2363

Vous devez utiliser le contrôle NotifyIcon de System.Windows.Forms, ou bien vous pouvez utiliser l'API Notify Icon fournie par l'API Windows. WPF ne fournit pas un tel équivalent, et cela a été demandé plusieurs fois sur Microsoft Connect.

J'ai du code sur GitHub qui utilise System.Windows.Forms du composant NotifyIcon à partir d'une application WPF, le code peut être consulté à l'adresse suivante https://github.com/wilson0x4d/Mubox/blob/master/Mubox.QuickLaunch/AppWindow.xaml.cs

Voici le résumé :

Créez une fenêtre WPF avec ShowInTaskbar=False, et qui est chargée dans un état non visible.

Au niveau de la classe :

private System.Windows.Forms.NotifyIcon notifyIcon = null;

Pendant OnInitialize() :

notifyIcon = new System.Windows.Forms.NotifyIcon();
notifyIcon.Click += new EventHandler(notifyIcon_Click);
notifyIcon.DoubleClick += new EventHandler(notifyIcon_DoubleClick);
notifyIcon.Icon = IconHandles["QuickLaunch"];

Pendant OnLoaded() :

notifyIcon.Visible = true;

Et pour l'interaction (représentée par notifyIcon.Click et DoubleClick ci-dessus) :

void notifyIcon_Click(object sender, EventArgs e)
{
    ShowQuickLaunchMenu();
}

À partir de là, vous pouvez reprendre l'utilisation des contrôles WPF et des API telles que les menus contextuels, les fenêtres contextuelles, etc.

C'est aussi simple que cela. Vous n'avez pas exactement besoin d'une fenêtre WPF pour accueillir le composant, c'est juste le moyen le plus pratique d'en introduire une dans une application WPF (car une fenêtre est généralement le point d'entrée par défaut défini via App.xaml), de même, vous n'avez pas besoin d'un wrapper WPF ou d'un contrôle tiers, car le composant SWF est garanti présent dans toute installation . NET Framework qui prend également en charge WPF puisqu'il fait partie du .NET Framework (sur lequel toutes les versions actuelles et futures du .NET Framework reposent). À ce jour, rien n'indique de la part de Microsoft que la prise en charge de SWF sera bientôt abandonnée dans le .NET Framework.

J'espère que cela vous aidera.

Le fait que vous deviez utiliser un composant de Framework pré-3.0 pour obtenir une icône de notification est un petit fromage, mais comme Microsoft l'a expliqué, il n'y a pas de concept de System Tray dans le cadre de WPF. WPF est une technologie de présentation, et les icônes de notification sont un concept de système d'exploitation (et non de "présentation").

55voto

ดาว Points 7105

J'ai récemment eu ce même problème. Malheureusement, NotifyIcon n'est pour l'instant qu'un contrôle Windows.Forms. Si vous voulez l'utiliser, vous allez devoir inclure cette partie du framework. Je suppose que cela dépend de votre degré de purisme à l'égard de WPF.

Si vous voulez un moyen rapide et facile de commencer, consultez ce document. Contrôle WPF NotifyIcon sur le projet de code qui ne s'appuie pas du tout sur le NotifyIcon de WinForms. Une version plus récente semble être disponible sur le site de l'auteur et en tant que Paquet NuGet . Cette méthode me semble être la meilleure et la plus propre jusqu'à présent.

  • ToolTips riches plutôt que du texte
  • Menus contextuels et fenêtres contextuelles WPF
  • Aide au commandement et événements acheminés
  • Liaison flexible des données
  • Des messages de type ballon riche plutôt que les messages par défaut fournis par l OS

Vérifiez-le. Il est livré avec un exemple d'application incroyable, très facile à utiliser, et vous pouvez avoir des popups WPF, des info-bulles et des menus contextuels dans le style de Windows Live Messenger. Parfait pour afficher un flux RSS, je l'utilise dans un but similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X