WPFAnwendung mit TrayIcon
Eine WPF Anwendung mit einem TrayIcon zu versehen ist eine einfache Sache. Doch dazu müssen wir uns - bitte nicht erschrecken - bei WindowsForms bedienen. Zuallerst schaffen wir uns wie gewohnt eine WPF Anwendung mit dem Project Wizard. Diese entspricht einer völlig normalen WPF Anwendung und wird auch eine solche bleiben. Natürlich wäre es möglich in einer WindowsForms Anwendung WPF zu hosten, aber das ist nicht der Weg, den wir hier gehen wollen. Sondern wir erweiteren eine WPF Anwendung um Funktionalitäten, die wir von WindowsForms her kennen. Dazu bringen wir die Referenzen "System.Windows.Forms" und "System.Drawing" in unsere Anwendung mit "Add Reference".

Damit wir im Tray erscheinen, benötigen wir auch ein TrayIcon. Das malen wir mal auf die Schnelle in der Oberfläche, nachdem wir zuvor "Add New Item" im Kontextmenü des Projektes aufgerufen und Icon File ausgewählt haben. Dieses nennen wir entsprechend der Anwendung und malen los.

Wenn wir mit unserem künstlerischem Werk zufrieden sind, setzen wir noch die Properties der Icon Datei auf "embedded Resource" und natürlich wollen wir die Datei nicht kopieren.

Dann gehen wir in die App.xaml und rufen den Code Behind auf: App.xaml.cs. Wir machen das in der Anwendung, denn wir wollen ja nicht ein Fenster, sondern die gesamte Anwendung mit einem Tray versehen. Dies geschieht in folgendem Code
public partial class App : System.Windows.Application
{
private System.Windows.Forms.NotifyIcon notifyIcon;
protected override void OnStartup(StartupEventArgs e)
{
notifyIcon = new System.Windows.Forms.NotifyIcon();
System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly();
Stream stream = a.GetManifestResourceStream("MyApplication.MyIcon.ico");
notifyIcon.Icon = new Icon(stream);
notifyIcon.Text = "Meine Anwendung";
notifyIcon.Click += new EventHandler(notifyIcon_Click);
notifyIcon.Visible = true;
}
void notifyIcon_Click(object sender, EventArgs e)
{
notifyIcon.BalloonTipText = "Diese Anwendung hat ein Tray Icon";
notifyIcon.BalloonTipTitle = "Meine Anwendung";
notifyIcon.ShowBalloonTip(2000);
}
}
Zuerst müssen wir die Basisklasse von unserer partial class genauer definieren. Durch die Reference von Windows.Forms ist diese nun doppelt besetzt (man kann auch auf das "using System.Windows.Forms;" verzichten, aber warum sollte man). Dann schaffen wir unser TrayIcon als System.Windows.Forms.NotifyIcon. Das befüllen wir im OnStartup - früher benötigen wir das nicht, später wäre aber auch keine so gute Idee. Dazu holen wir uns den ResourceStream aus der Assembly heraus . Wäre schön, den noch auf Null zu überprüfen, der Übersicht halber habe ich das oben nicht getan, ist aber unbedingt empfehlenswert. Wenn es gut klappt, haben wir nun unser gemaltes Icon, das wir nun noch mit einem Click-Handler versehen.
In dem Click-Handler lasse ich ein Ballon Tooltip kurz einblenden. Natürlich kann man da auch alle anderen netten Sachen machen, wie beispielsweise alle Fenster minimieren. Auch kann man statt dem Click-Handler ein ContextMenuStrip erstellen und dem notifyIcon.ContextMenuStrip diesen zuweisen. Dadurch hat man dann ein nettes Menü. Viel Spaß dabei.