Application WPF qui n'a qu'une icône de barre d'état

144

Je suis un débutant total de WPF et je me demande si quelqu'un pourrait me donner des conseils sur la façon d'écrire une application qui commence à être réduite au bac. L'idée est qu'il récupère périodiquement un flux RSS et crée un Toaster-Popup lorsqu'il y a de nouveaux flux.

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

J'ai commencé à lire sur XAML et WPF et je sais que StartupUri dans App.xaml doit pointer vers ma fenêtre principale, mais je n'ai aucune idée de la bonne manière de faire l'icône SysTray et de masquer la fenêtre principale (cela aussi signifie que lorsque l'utilisateur réduit la fenêtre, elle doit la réduire dans la barre d'état, pas dans la barre des tâches).

Des indices?

Michael Stum
la source
3
Merci pour toutes les suggestions! Le WPF-NotifyIcon est ce que je vais utiliser, car un test rapide montre qu'il est assez prometteur et indolore.
Michael Stum

Réponses:

114

Il n'y a pas de NotifyIcon pour WPF.

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

Drew Noakes
la source
2
Fantastique bibliothèque. J'ai hâte de l'utiliser!
Rob Hay
2
Drew, le lien semble être mort ici. Avez-vous un lien alternatif pour cette bibliothèque? J'ai fait une recherche rapide, mais je n'ai pas pu déterminer si les résultats étaient pour le même projet.
Brad Larson
@BradLarson, le site semble être en panne; mais de toute façon le projet est disponible sous forme de package Nuget (voir la réponse de Dale)
Thomas Levesque
4
Malgré le grand nombre de votes, cette réponse ne constitue pas une réponse utile et légitime de Stack Overflow. Il s'agit en fait d'une réponse en lien uniquement, contrairement aux standards de Stack Overflow. Veuillez améliorer cette réponse en fournissant les informations spécifiques et importantes dans la réponse elle-même. Cela garantira que les informations sont disponibles quel que soit le statut du site externe.
Evan Larsen
107

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

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

Voici les bits de 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 (indiquée par notifyIcon.Click et DoubleClick ci-dessus):

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

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

C'est si simple. Vous n'avez pas exactement besoin d'une fenêtre WPF pour héberger 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 ne le faites pas. Vous avez besoin d'un WPF Wrapper 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 car il fait partie du .NET Framework (sur lequel toutes les versions actuelles et futures de .NET Framework s'appuient). À ce jour, rien n'indique de la part de Microsoft que la prise en charge de SWF sera bientôt supprimée du .NET Framework.

J'espère que cela pourra aider.

C'est un peu le fromage que vous devez utiliser un composant de cadre pré-3.0 pour obtenir une icône de barre d'état, mais comme Microsoft l'a expliqué, il n'y a pas de concept de barre d'état système 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»).

Shaun Wilson
la source
2
Merci pour l'explication détaillée!
Michael Stum
4
+1, cela devrait être la réponse choisie pour l'explication seule.
ToastyMallows
2
Félicitations pour ce dernier paragraphe. C'était exactement ce que j'avais besoin de savoir, et c'est ce niveau de détail simple et perspicace qui sent bon le développeur.
Matthew Layton
1
La partie amusante de ce dernier paragraphe est "WPF est Windows uniquement" est maintenant l'excuse de Microsoft pour ne pas créer WPF multiplateforme sur .NET Core. C'est donc uniquement Windows, mais pas assez Windows uniquement pour exposer les fonctionnalités spécifiques à Windows?
McGuireV10
1
Je suis le seul à ne pas aimer les références à System.Windows.Forms dans mon application WPF?
Joel le
48

J'ai récemment eu ce même problème. Malheureusement, NotifyIcon est uniquement un contrôle Windows.Forms pour le moment, si vous voulez l'utiliser, vous devrez inclure cette partie du framework. Je suppose que cela dépend à quel point vous êtes un puriste WPF.

Si vous voulez un moyen rapide et facile de commencer, consultez ce contrôle WPF NotifyIcon sur le projet de code qui ne repose pas du tout sur WinForms NotifyIcon. Une version plus récente semble être disponible sur le site Web de l'auteur et sous forme de package NuGet . Cela me semble être le moyen le meilleur et le plus propre jusqu'à présent.

  • Info-bulles riches plutôt que du texte
  • Menus contextuels et fenêtres contextuelles WPF
  • Prise en charge des commandes et événements routés
  • Liaison de données flexible
  • Messages de bulles riches plutôt que les messages par défaut fournis par le système d'exploitation

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

Vallée
la source
5
pour les nouveaux arrivants en 2017, ce paquet nuget est obsolète mais publié sous un nom différent comme nuget.org/packages/Hardcodet.NotifyIcon.Wpf
mcy