WPF-Anwendung, die nur ein Tray-Symbol hat

144

Ich bin ein absoluter WPF-Neuling und frage mich, ob mir jemand einige Hinweise geben könnte, wie man eine Anwendung schreibt, die auf Tray minimiert beginnt. Die Idee ist, dass es regelmäßig einen RSS-Feed abruft und ein Toaster-Popup erstellt, wenn neue Feeds vorhanden sind.

Die Anwendung sollte weiterhin ein Hauptfenster haben (im Wesentlichen nur eine Liste mit allen Feedeinträgen), die jedoch standardmäßig ausgeblendet sein sollte.

Ich habe angefangen, über XAML und WPF zu lesen, und ich weiß, dass das StartupUri in der App.xaml auf mein Hauptfenster zeigen muss, aber ich habe keine Ahnung, wie das SysTray-Symbol richtig ausgeführt und das Hauptfenster ausgeblendet werden soll (dies auch bedeutet, dass wenn der Benutzer das Fenster minimiert, es auf die Taskleiste und nicht auf die Taskleiste minimiert werden sollte.

Irgendwelche Hinweise?

Michael Stum
quelle
3
Danke für alle Vorschläge! Das WPF-NotifyIcon ist das, was ich machen werde, da ein schneller Test zeigt, dass es vielversprechend und schmerzlos ist.
Michael Stum

Antworten:

114

Es gibt kein NotifyIcon für WPF.

Ein Kollege von mir hat diese frei verfügbare Bibliothek effektiv genutzt:

Drew Noakes
quelle
2
Fantastische Bibliothek. Ich kann es kaum erwarten, es zu nutzen!
Rob Hay
2
Drew, der Link scheint hier tot zu sein. Haben Sie einen alternativen Link für diese Bibliothek? Ich habe eine schnelle Suche durchgeführt, konnte aber nicht feststellen, ob die Ergebnisse für dasselbe Projekt waren.
Brad Larson
@BradLarson, die Seite scheint ausgefallen zu sein; Trotzdem ist das Projekt als Nuget-Paket erhältlich (siehe Dales Antwort)
Thomas Levesque,
4
Ungeachtet der großen Anzahl von Stimmen stellt diese Antwort keine nützliche, legitime Antwort auf den Stapelüberlauf dar. Dies ist im Gegensatz zu den Stack Overflow-Standards praktisch eine reine Link-Antwort. Bitte verbessern Sie diese Antwort, indem Sie die spezifischen, wesentlichen Informationen in der Antwort selbst angeben. Dadurch wird sichergestellt, dass die Informationen unabhängig vom Status der externen Site verfügbar sind.
Evan Larsen
107

Sie müssen das NotifyIcon-Steuerelement von System.Windows.Forms verwenden, oder Sie können alternativ die von der Windows-API bereitgestellte Notify Icon-API verwenden. WPF bietet kein solches Äquivalent und wurde mehrmals in Microsoft Connect angefordert.

Ich habe Code auf GitHub, der System.Windows.FormsNotifyIcon Component aus einer WPF-Anwendung verwendet. Der Code kann unter https://github.com/wilson0x4d/Mubox/blob/master/Mubox.QuickLaunch/AppWindow.xaml.cs angezeigt werden

Hier sind die Zusammenfassungsbits:

Erstellen Sie ein WPF-Fenster mit ShowInTaskbar = False, das in einem nicht sichtbaren Zustand geladen wird.

Auf Klassenebene:

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

Während OnInitialize ():

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

Während OnLoaded ():

notifyIcon.Visible = true;

Und für die Interaktion (oben als notifyIcon.Click und DoubleClick dargestellt):

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

Von hier aus können Sie die Verwendung von WPF-Steuerelementen und APIs wie Kontextmenüs, Popup-Fenstern usw. wieder aufnehmen.

So einfach ist das. Sie benötigen nicht unbedingt ein WPF-Fenster, um die Komponente zu hosten. Dies ist nur die bequemste Möglichkeit, eines in eine WPF-App einzuführen (da ein Fenster im Allgemeinen der über App.xaml definierte Standardeinstiegspunkt ist). Sie benötigen keinen WPF-Wrapper oder ein Steuerelement eines Drittanbieters, da die SWF-Komponente garantiert in jeder .NET Framework-Installation vorhanden ist, die auch WPF-Unterstützung bietet, da sie Teil des .NET Framework ist (auf dem alle aktuellen und zukünftigen .NET Framework-Versionen aufbauen). Bisher gibt es keinen Hinweis von Microsoft, dass die SWF-Unterstützung bald aus .NET Framework entfernt wird.

Hoffentlich hilft das.

Es ist ein kleiner Käse, dass Sie eine Framework-Komponente vor 3.0 verwenden müssen, um ein Tray-Symbol zu erhalten, aber verständlicherweise gibt es, wie Microsoft es erklärt hat, kein Konzept für eine Taskleiste im Rahmen von WPF. WPF ist eine Präsentationstechnologie, und Benachrichtigungssymbole sind ein Betriebssystemkonzept (keine "Präsentation").

Shaun Wilson
quelle
2
Danke für die ausführliche Erklärung!
Michael Stum
4
+1, dies sollte die ausgewählte Antwort allein für die Erklärung sein.
ToastyMallows
2
Ein großes Lob für diesen letzten Absatz. Das war genau das, was ich wissen musste, und es ist diese Ebene einfacher, aufschlussreicher Details, die nach einem guten Entwickler riecht.
Matthew Layton
1
Der lustige Teil dieses letzten Absatzes ist "WPF ist nur für Windows". Dies ist jetzt die Entschuldigung von Microsoft, WPF nicht plattformübergreifend auf .NET Core zu machen. Es ist also nur Windows, aber nicht nur Windows genug, um Windows-spezifische Funktionen verfügbar zu machen?
McGuireV10
1
Ich bin der einzige, der Verweise auf System.Windows.Forms in meiner WPF-App nicht mag.
Joel
48

Ich hatte vor kurzem das gleiche Problem. Leider ist NotifyIcon derzeit nur ein Windows.Forms-Steuerelement. Wenn Sie es verwenden möchten, müssen Sie diesen Teil des Frameworks einschließen. Ich denke, das hängt davon ab, wie sehr Sie ein WPF-Purist sind.

Wenn Sie schnell und einfach loslegen möchten, lesen Sie dieses WPF NotifyIcon-Steuerelement für das Code-Projekt, das überhaupt nicht auf WinForms NotifyIcon basiert. Eine neuere Version scheint auf der Website des Autors und als NuGet-Paket verfügbar zu sein . Dies scheint mir der bisher beste und sauberste Weg zu sein.

  • Rich ToolTips statt Text
  • WPF-Kontextmenüs und Popups
  • Befehlsunterstützung und geroutete Ereignisse
  • Flexible Datenbindung
  • Reichhaltige Sprechblasen-Nachrichten anstelle der vom Betriebssystem bereitgestellten Standardnachrichten

Hör zu. Es kommt auch mit einer erstaunlichen Beispiel-App, die sehr einfach zu bedienen ist, und Sie können gut aussehende WPF-Popups, Tooltips und Kontextmenüs im Windows Live Messenger-Stil haben. Perfekt für die Anzeige eines RSS-Feeds. Ich verwende ihn für einen ähnlichen Zweck.

Tal
quelle
5
Für Neulinge im Jahr 2017 ist dieses Nuget-Paket veraltet und wird unter einem anderen Namen als nuget.org/packages/Hardcodet.NotifyIcon.Wpf
mcy