Додаток WPF, у якому є лише значок лотка


144

Я взагалі новачок на WPF і цікавлюсь, чи не міг би хтось дати мені вказівки, як написати програму, яка починається мінімізувати лоток. Ідея полягає в тому, що він періодично отримує RSS-канал і створює Toaster-Popup, коли є нові канали.

У додатку все одно має бути головне вікно (фактично лише список, що містить усі записи каналу), але це має бути приховано за замовчуванням.

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

Якісь підказки?


3
Дякую за всі пропозиції! WPF-NotifyIcon - це те, з чим я піду, оскільки швидкий тест показує, що це досить перспективно і безболісно.
Майкл Стум

Відповіді:


114

Для WPF немає NotifyIcon.

Моя колега використовувала цю вільно доступну бібліотеку для гарного ефекту:


2
Фантастична бібліотека. Не можете чекати, щоб використати це!
Роб Хей

2
Дрю, схоже, посилання тут померло. Чи є у вас альтернативна посилання на цю бібліотеку? Я швидко здійснив пошук, але не зміг визначити, чи були результати для одного проекту.
Бред Ларсон

@BradLarson, сайт, здається, не працює; але все одно проект доступний як пакет Nuget (див. відповідь Дейла)
Томас Левеск

4
Незважаючи на велику кількість голосів, ця відповідь не є корисною, законною відповіддю на переповнення стека. Це фактично відповідь лише на посилання, всупереч стандартам переповнення стека. Будь ласка, вдосконаліть цю відповідь, надавши конкретну, суттєву інформацію у самій відповіді. Це забезпечить доступність інформації незалежно від статусу зовнішнього сайту.
Еван Ларсен

107

Потрібно використовувати контроль NotifyIcon від System.Windows.Forms, або ж ви можете використовувати API Notify Icon, наданий API Windows. 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();
}

Звідси ви можете відновити використання елементів керування та API WPF, таких як контекстні меню, спливаючі вікна тощо.

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

Сподіваюся, що це допомагає.

Це трохи сиру, що вам потрібно використовувати рамковий компонент до 3.0, щоб отримати піктограму лотка, але, зрозуміло, як це пояснила Microsoft, не існує концепції системного лотка в межах 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 у проекті Code, який взагалі не покладається на WinForms NotifyIcon. Більш свіжа версія, здається, доступна на веб-сайті автора і як пакет NuGet . Це здається мені найкращим і найчистішим способом поки що.

  • Підказки з насиченим інструментом, а не текст
  • Контекстні меню та спливаючі вікна WPF
  • Підтримка команд та маршрутизовані події
  • Гнучка прив'язка даних
  • Повідомлення з багатовимірними кулями, а не повідомлення за замовчуванням, що надаються ОС

Перевір. Він також постачає дивовижне зразкове додаток, дуже просте у використанні, і ви можете мати прекрасні спливаючі вікна WPF у стилі Windows Live Messenger, підказки та контекстні меню. Ідеально підходить для відображення RSS-каналу, я використовую його для подібних цілей.


5
для новачків у 2017 році цей пакунок застарілих, але опублікований під іншою назвою як nuget.org/packages/Hardcodet.NotifyIcon.Wpf
mcy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.