Как создать иконку в системном трее WPF при отсутствии основного окна хоста - PullRequest
10 голосов
/ 02 марта 2011

Фон

У нас есть приложение, которое находится в фоновом режиме и использует FileSystemWatcher для отслеживания папки для новых файлов, когда появляется новый файл, он порождает окно.

Что мне нужно сделать, так это создать иконку в системном трее для этого приложения, чтобы мы могли добавить к ней простые элементы контекстного меню (самая большая возможность закрыть приложение, не заходя в диспетчер задач).

Вопрос

Все результаты поиска о том, как реализовать значок в системном трее, указывают на примеры того, как добавить его в окно WPF, а не в само приложение, поскольку мое приложение неу меня нет главного окна и появляется окно при возникновении события, как я могу это реализовать?

1 Ответ

10 голосов
/ 01 октября 2012

Установите для приложения ShutdownMode значение OnExplicitShutdown и отобразите значок на панели задач из Application.OnStartup.В этом примере используются NotifyIcon из WinForms, поэтому добавьте ссылку на System.Windows.Forms.dll и System.Drawing.dll.Также добавьте встроенный ресурс для иконки в трее.

App.xaml

<Application x:Class="WpfTrayIcon.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             ShutdownMode="OnExplicitShutdown"
             >
    <Application.Resources>

    </Application.Resources>
</Application>

App.xaml.cs

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Windows;

using NotifyIcon = System.Windows.Forms.NotifyIcon;

namespace WpfTrayIcon
{
    public partial class App : Application
    {
        public static NotifyIcon icon;

        protected override void OnStartup(StartupEventArgs e)
        {
            App.icon = new NotifyIcon();
            icon.Click += new EventHandler(icon_Click);
            icon.Icon = new System.Drawing.Icon(typeof(App), "TrayIcon.ico");
            icon.Visible = true;

            base.OnStartup(e);
        }

        private void icon_Click(Object sender, EventArgs e)
        {
            MessageBox.Show("Thanks for clicking me");
        }
    }
}
...