Приложение WPF, которое имеет только иконку в трее

144

Я новичок в WPF, и мне интересно, кто-нибудь может дать мне несколько советов, как написать приложение, которое будет свернуто в трей. Идея состоит в том, что он периодически выбирает RSS-канал и создает всплывающее окно с тостером при появлении новых каналов.

Приложение должно по-прежнему иметь главное окно (по сути, просто список, содержащий все записи фида), но оно должно быть скрыто по умолчанию.

Я начал читать о XAML и WPF и знаю, что StartupUri в App.xaml должен указывать на мое главное окно, но я понятия не имею, как правильно сделать значок SysTray и скрыть главное окно (это также означает, что когда пользователь сворачивает окно, оно должно быть свернуто в трей, а не в панель задач).

Есть намеки?

Майкл Стум
источник
3
Спасибо за все предложения! WPF-NotifyIcon - это то, с чем я пойду, поскольку быстрый тест показывает, что он довольно многообещающий и безболезненный.
Майкл Стум

Ответы:

114

Там нет NotifyIcon для WPF.

Мой коллега использовал эту свободно доступную библиотеку для хорошего эффекта:

Дрю Ноакс
источник
2
Фантастическая библиотека. Не могу дождаться, чтобы использовать его!
Роб Хей
2
Дрю, ссылка, кажется, здесь замерла. У вас есть альтернативная ссылка на эту библиотеку? Я сделал быстрый поиск, но не смог определить, были ли результаты для того же проекта.
Брэд Ларсон
@BradLarson, сайт, кажется, не работает; но в любом случае проект доступен в виде пакета Nuget (см. ответ Дейла)
Томас Левеск
4
Несмотря на большое количество голосов, этот ответ не является полезным, законным ответом переполнения стека. Это эффективный ответ только для ссылок, в отличие от стандартов переполнения стека. Пожалуйста, улучшите этот ответ, предоставив конкретную, существенную информацию в самом ответе. Это обеспечит доступность информации независимо от статуса внешнего сайта.
Эван Ларсен
107

Вы должны использовать элемент управления NotifyIcon из System.Windows.Forms или, в качестве альтернативы, вы можете использовать API значка уведомлений, предоставляемый Windows API. WPF не предоставляет такого эквивалента, и его несколько раз запрашивали в Microsoft Connect.

У меня есть код на GitHub, который использует System.Windows.Formsкомпонент NotifyIcon из приложения WPF, код можно посмотреть по адресу https://github.com/wilson0x4d/Mubox/blob/master/Mubox.QuickLaunch/AppWindow.xaml.cs

Вот краткие биты:

Создайте окно WPF с ShowInTaskbar = False, которое загружается в невидимом состоянии.

На уровне класса:

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

Во время OnInitialize ():

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

Во время OnLoaded ():

notifyIcon.Visible = true;

И для взаимодействия (показано как notifyIcon.Click и DoubleClick выше):

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

Отсюда вы можете возобновить использование элементов управления WPF и API, таких как контекстные меню, всплывающие окна и т. Д.

Это так просто. Вам точно не нужно окно WPF для размещения компонента, это просто самый удобный способ ввести его в приложение WPF (поскольку окно, как правило, является точкой входа по умолчанию, определенной через App.xaml), также вы не не требуется WPF Wrapper или сторонний элемент управления, так как компонент SWF гарантированно присутствует в любой установке .NET Framework, которая также имеет поддержку WPF, поскольку он является частью .NET Framework (на котором основаны все текущие и будущие версии .NET Framework.) На сегодняшний день от Microsoft нет никаких признаков того, что поддержка SWF будет прекращена в .NET Framework в ближайшее время.

Надеюсь, это поможет.

Немного сыра, что для получения иконки в трее необходимо использовать компонент Framework до версии 3.0, но, как объяснила Microsoft, концепция System Tray в рамках WPF отсутствует. WPF - это технология презентации, а значки уведомлений - это концепция операционной системы (а не «презентация»).

Шон Уилсон
источник
2
Спасибо за подробное объяснение!
Майкл Стум
4
+1, это должен быть выбранный ответ только для объяснения.
ToastyMallows
2
Престижность этого последнего абзаца. Это было именно то, что мне нужно было знать, и именно этот уровень простых, проницательных деталей напоминает хорошего разработчика.
Мэтью Лейтон
1
Самое смешное в этом последнем абзаце - «WPF только для Windows» - теперь оправдание Microsoft за то, что он не делает WPF кроссплатформенным в .NET Core. Таким образом, это только для Windows, но не достаточно только для Windows, чтобы раскрыть специфичные для Windows функции?
McGuireV10
1
Я единственный, кто не любит ссылки на System.Windows.Forms в моем приложении WPF?
Джоэл
48

У меня недавно была такая же проблема. К сожалению, на данный момент NotifyIcon является только элементом управления Windows.Forms, и если вы хотите его использовать, вам придется включить эту часть платформы. Я полагаю, это зависит от того, насколько вы пурист WPF.

Если вы хотите быстро и легко начать работу, проверьте этот элемент управления WPF NotifyIcon в проекте кода, который вообще не использует WinForms NotifyIcon. Более свежая версия, кажется, доступна на веб-сайте автора и в виде пакета NuGet . Это кажется лучшим и самым чистым способом для меня до сих пор.

  • Богатые подсказки, а не текст
  • WPF контекстные меню и всплывающие окна
  • Поддержка команд и перенаправленные события
  • Гибкая привязка данных
  • Богатые всплывающие сообщения, а не сообщения по умолчанию, предоставляемые ОС

Проверьте это. Он также поставляется с удивительным примером приложения, очень простым в использовании, и вы можете иметь великолепно выглядящие всплывающие окна, всплывающие подсказки и контекстные меню в стиле Windows Live Messenger. Идеально подходит для отображения RSS-канала, я использую его для аналогичных целей.

Дол
источник
5
для новичков в 2017 году этот пакет nuget
mcy