web-dev-qa-db-fra.com

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

Je suis un novice total de WPF et je me demande si quelqu'un pourrait me donner des indications sur la manière d'écrire une application dont le démarrage est réduit au minimum. L'idée est qu'il extrait périodiquement un flux RSS et crée un grille-pain contextuel lorsqu'il y a de nouveaux flux.

L'application doit toujours avoir une fenêtre principale (essentiellement une liste contenant toutes les entrées de flux), mais elle 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 sur ma fenêtre principale, mais je ne sais pas comment il convient d'utiliser l'icône SysTray et de masquer la fenêtre principale (cela aussi. signifie que lorsque l'utilisateur réduit la fenêtre, il faut le réduire dans la barre des tâches, pas dans la barre des tâches).

Des allusions?

137
Michael Stum

Il n'y a pas NotifyIcon pour WPF.

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

109
Drew Noakes

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 pas un tel équivalent et cela a été demandé à plusieurs reprises sur Microsoft Connect.

J'ai un code sur GitHub qui utilise System.Windows.Forms 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 les bits de résumé:

Créez une fenêtre WPF avec ShowInTaskbar = False et 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();
}

À partir 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 simplement le moyen le plus pratique d'introduire une fenêtre dans une application WPF (étant donné qu'une fenêtre est généralement le point d'entrée par défaut défini via App.xaml). Vous n'avez pas besoin d'un contrôle WPF Wrapper ou tiers, car le composant SWF est garanti présent dans toute installation .NET Framework prenant é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, Microsoft n’indique pas que la prise en charge de SWF sera bientôt supprimée du .NET Framework.

J'espère que ça t'as aidé.

C'est un petit fromage que vous devez utiliser un composant Framework pré-3.0 pour obtenir une icône de bac, mais comme l'a expliqué Microsoft, il n'existe aucun concept de plateau 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").

98
Shaun Wilson

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

Si vous voulez un moyen rapide et facile de commencer, vérifiez ceci le contrôle NotifyIcon de WPF sur le projet de code qui ne repose pas sur le WinForms NotifyIcon du tout. Une version plus récente semble être disponible sur le site Web de l'auteur et en tant que package NuGet . Cela semble être le moyen le plus propre et le meilleur pour moi jusqu'à présent.

  • Rich ToolTips plutôt que du texte
  • Menus contextuels et popups WPF
  • Prise en charge des commandes et des événements routés
  • Liaison de données flexible
  • Messages ballon enrichis plutôt que les messages par défaut fournis par le système d'exploitation

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

48
Dale