Applicazione WPF che ha solo un'icona nella barra delle applicazioni


144

Sono un principiante WPF totale e mi chiedo se qualcuno potrebbe darmi alcuni suggerimenti su come scrivere un'applicazione che inizia minimizzata nel vassoio. L'idea è che recupera periodicamente un feed RSS e crea un popup Toaster quando sono presenti nuovi feed.

L'applicazione dovrebbe avere ancora una finestra principale (essenzialmente solo un elenco contenente tutte le voci del feed), ma dovrebbe essere nascosto per impostazione predefinita.

Ho iniziato a leggere su XAML e WPF e so che StartupUri in App.xaml deve puntare alla mia finestra principale, ma non ho idea di quale sia il modo corretto di fare l'icona SysTray e nascondere la finestra principale (anche questa significa che quando l'utente minimizza la finestra, dovrebbe minimizzare sul vassoio, non sulla barra delle applicazioni).

Qualche suggerimento?


3
Grazie per tutti i suggerimenti! Il WPF-NotifyIcon è quello che seguirò, poiché un test rapido mostra che è abbastanza promettente e indolore.
Michael Stum

Risposte:


114

Non c'è NotifyIcon per WPF.

Un mio collega ha usato questa libreria liberamente disponibile con buoni risultati:


2
Biblioteca fantastica. Non vedo l'ora di utilizzarlo!
Rob Hay,

2
Drew, il link sembra essere morto qui. Hai un link alternativo per questa libreria? Ho fatto una ricerca veloce, ma non sono riuscito a determinare se i risultati fossero per lo stesso progetto.
Brad Larson

@BradLarson, il sito sembra essere inattivo; ma comunque il progetto è disponibile come pacchetto Nuget (vedi la risposta di Dale)
Thomas Levesque,

4
Nonostante il gran numero di voti, questa risposta non costituisce una risposta utile e legittima allo Stack Overflow. È effettivamente una risposta di solo collegamento, contrariamente agli standard Stack Overflow. Migliora questa risposta fornendo le informazioni specifiche e materiali nella risposta stessa. Ciò assicurerà che le informazioni siano disponibili indipendentemente dallo stato del sito esterno.
Evan Larsen,

107

È necessario utilizzare il controllo NotifyIcon da System.Windows.Forms oppure, in alternativa, è possibile utilizzare l'API dell'icona di notifica fornita dall'API di Windows. WPF non fornisce tale equivalente ed è stato richiesto più volte su Microsoft Connect.

Ho un codice su GitHub che utilizza System.Windows.FormsNotifyIcon Component all'interno di un'applicazione WPF, il codice può essere visualizzato su https://github.com/wilson0x4d/Mubox/blob/master/Mubox.QuickLaunch/AppWindow.xaml.cs

Ecco i bit di riepilogo:

Creare una finestra WPF con ShowInTaskbar = False e che viene caricato in uno stato non visibile.

A livello di classe:

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

Durante OnInitialize ():

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

Durante OnLoaded ():

notifyIcon.Visible = true;

E per l'interazione (mostrato come notificationIcon.Click e DoubleClick sopra):

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

Da qui è possibile riprendere l'uso dei controlli e delle API WPF come menu di scelta rapida, finestre popup, ecc.

È così semplice. Non è necessaria esattamente una finestra WPF per ospitare il componente, è solo il modo più conveniente per introdurlo in un'app WPF (poiché una finestra è generalmente il punto di ingresso predefinito definito tramite App.xaml), inoltre, non è necessario ' È necessario un wrapper WPF o un controllo di terze parti, poiché il componente SWF è garantito presente in qualsiasi installazione di .NET Framework che ha anche il supporto WPF poiché fa parte di .NET Framework (su cui si basano tutte le versioni .NET Framework attuali e future). Ad oggi, Microsoft non ha alcuna indicazione che il supporto SWF verrà presto rimosso da .NET Framework.

Spero che aiuti.

È un po 'di formaggio che devi usare un Componente Framework pre-3.0 per ottenere un'icona a forma di vassoio, ma comprensibilmente come Microsoft lo ha spiegato, non esiste un concetto di barra delle applicazioni nell'ambito di WPF. WPF è una tecnologia di presentazione e le icone di notifica sono un concetto di sistema operativo (non di "presentazione").


2
Grazie per la spiegazione dettagliata!
Michael Stum

4
+1, questa dovrebbe essere la risposta selezionata per la sola spiegazione.
ToastyMallows

2
Complimenti per l'ultimo paragrafo. Era esattamente quello che dovevo sapere, ed è questo livello di dettagli semplici e penetranti che sa di un buon sviluppatore.
Matthew Layton,

1
La parte divertente di quell'ultimo paragrafo è "WPF è solo per Windows" è ora la scusa di Microsoft per non creare multipiattaforma WPF su .NET Core. Quindi è solo Windows, ma non solo Windows per esporre funzionalità specifiche di Windows?
McGuireV10,

1
Sono l'unico a cui non piacciono i riferimenti a System.Windows.Forms nella mia app WPF?
Gioele il

48

Di recente ho avuto questo stesso problema. Sfortunatamente, NotifyIcon è solo un controllo Windows.Forms al momento, se vuoi usarlo dovrai includere quella parte del framework. Immagino che dipenda da quanto sei un purista WPF.

Se vuoi un modo semplice e veloce per iniziare, dai un'occhiata a questo controllo NotifyIcon di WPF sul Progetto Codice che non si basa affatto su NotifyIcon di WinForms. Una versione più recente sembra essere disponibile sul sito Web dell'autore e come pacchetto NuGet . Finora mi sembra il modo migliore e più pulito.

  • Rich ToolTips anziché testo
  • Menu contestuali e popup WPF
  • Supporto comandi ed eventi indirizzati
  • Rilegatura flessibile dei dati
  • Messaggi con fumetto ricco anziché i messaggi predefiniti forniti dal sistema operativo

Controlla. Viene fornito anche con un'app di esempio straordinaria, molto facile da usare e puoi avere popup, descrizioni comandi e menu contestuali WPF in stile Windows Live Messenger di bell'aspetto. Perfetto per visualizzare un feed RSS, lo sto usando per uno scopo simile.


5
per i nuovi arrivati ​​nel 2017, quel pacchetto nuget è obsoleto ma pubblicato con un nome diverso come nuget.org/packages/Hardcodet.NotifyIcon.Wpf
mcy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.