2009-09-24 7 views
118

Je suis un débutant WPF total et je me demande si quelqu'un pourrait me donner quelques conseils sur la façon d'écrire une application qui commence réduite au plateau. 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.WPF Application qui a seulement une icône de plateau

L'application devrait toujours avoir une fenêtre principale (essentiellement une liste contenant toutes les entrées de flux), mais qui devrait être cachée par défaut. J'ai commencé à lire sur XAML et WPF et je sais que le StartupUri dans l'App.xaml doit pointer vers ma fenêtre principale, mais je n'ai aucune idée de la façon appropriée de faire l'icône SysTray et de masquer la principale fenêtre (cela signifie également que lorsque l'utilisateur réduit la fenêtre, il doit réduire à la barre d'état, pas à la barre des tâches).

Des indices?

+3

Merci pour toutes les suggestions! Le WPF-NotifyIcon est ce que je vais faire, car un test rapide montre que c'est assez prometteur et indolore. –

Répondre

94
+1

Fantastique bibliothèque. J'ai hâte de l'utiliser! –

+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. –

+0

@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) –

47

J'ai récemment eu ce même problème. Malheureusement, NotifyIcon est seulement 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 de WPF.

Si vous voulez un moyen rapide et facile de commencer, consultez ce WPF NotifyIcon control on the Code Project qui ne dépend pas du WinForms NotifyIcon. Une version plus récente semble être disponible on the author's website et NuGet package. Cela semble être le moyen le meilleur et le plus propre pour moi jusqu'ici.

  • infobulles enrichies plutôt que du texte
  • WPF menus contextuels et popups
  • de support de commande et événements routés
  • données flexibles de liaison
  • messages ballon riches plutôt que les messages par défaut fournit par le OS

Check it out. Il est livré avec un exemple d'application incroyable, très facile à utiliser, et vous pouvez avoir de superbes fenêtres popup, infobulles et menus contextuels WPF de style Windows Live Messenger. Parfait pour afficher un flux RSS, je l'utilise dans un but similaire.

+2

pour les nouveaux arrivants en 2017, ce paquet nuget est obsolète mais publié sous un nom différent comme https://www.nuget.org/packages/Hardcodet.NotifyIcon.Wpf/ – mcy

77

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 Fournit pas un tel équivalent, et il a été demandé plusieurs fois sur Microsoft Connect.

je code sur GitHub qui utilise System.Windows.Forms NotifyIcon Component dans une application WPF, le code peut être consulté à https://github.com/wilson0x4d/Mubox/blob/master/Mubox.QuickLaunch/AppWindow.xaml.cs

Voici les bits de synthèse:

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

Au niveau de la classe:

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

Au cours OnInitialize():

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

Au cours onLoaded():

notifyIcon.Visible = true; 

Et pour l'interaction (comme montré 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 les API telles que les menus contextuels, les fenêtres pop-up, etc.

C'est aussi simple que cela. Vous n'avez pas vraiment besoin d'une fenêtre WPF pour héberger le composant, c'est juste le moyen le plus pratique d'en introduire un dans une application WPF (comme une fenêtre est généralement le point d'entrée par défaut défini via App.xaml), de même, Vous avez besoin d'un Wrapper WPF ou d'un contrôle tiers, car le composant SWF est garanti dans toute installation .NET Framework qui est également prise en charge par WPF car elle fait partie du .NET Framework (sur lequel s'appuient toutes les versions .NET Framework actuelles et futures). À ce jour, il n'y a aucune indication de la part de Microsoft que le support SWF sera bientôt supprimé du .NET Framework.

Espérons que cela aide.

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

+2

Merci pour l'explication détaillée! –

+2

+1, cela devrait être la réponse sélectionnée pour l'explication seule. – ToastyMallows

+1

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 ressemble à un bon développeur. – series0ne

Questions connexes