NotifyIcon в WPF приложении

суббота, 11 июля 2009 г.,

Задача: после запуска WPF Application в system tray, т.е. в правом нижнем углу экрана должна появиться иконка; при щелчке мышью по иконке надо показать окно; закрытие окон не должно приводить к закрытию приложения.

Реализовать иконку в system tray можно с помощью NotifyIcon; для этого в References проекта WPF Application надо:
  1. добавить сборку System.Windows.Forms.dll
  2. в App.xaml у тега Application убрать атрибут StartupUri
  3. в App.cs в class App добавить конструктор
    public App()
    {
        // закрытие всех окон приложения не приводит к его завершению
        this.ShutdownMode = ShutdownMode.OnExplicitShutdown;

        // создать иконку и поместить ее в system tray
        var ni = new System.Windows.Forms.NotifyIcon();
        ni.Visible = true;
        ni.Icon = WpfApplication6.Properties.Resources.Icon1;

        ni.Click += (s, _) =>
        {
            // создать и показать окно
            var uri = new Uri("Window1.xaml", UriKind.Relative);
            var wnd = Application.LoadComponent(uri) as Window;
            wnd.Visibility = Visibility.Visible;
            wnd.ShowInTaskbar = false;
        };

        // определить контекстное меню
        ni.ContextMenu = new System.Windows.Forms.ContextMenu(new[]
        {
            // завершить приложение
            new System.Windows.Forms.MenuItem("Exit", delegate
            {
                ni.Visible = false;
               this.Shutdown();
            })
        });
    }
Надо заметить, что если приложение будет закрыто по ошибке или из дебаггера, то иконка останется в system tray до тех пор пока над ней не окажется курсор мыши.

Комментариев нет: