Aplikacja WPF, która ma tylko ikonę w zasobniku

144

Jestem całkowitym nowicjuszem WPF i zastanawiam się, czy ktoś mógłby mi dać kilka wskazówek, jak napisać aplikację, która zaczyna się zminimalizować do zasobnika. Pomysł polega na tym, że okresowo pobiera źródło RSS i tworzy wyskakujące okienko tostera, gdy pojawiają się nowe źródła.

Aplikacja powinna nadal mieć okno główne (zasadniczo tylko listę zawierającą wszystkie wpisy kanału), ale powinno ono być domyślnie ukryte.

Zacząłem czytać o XAML i WPF i wiem, że StartupUri w App.xaml musi wskazywać na moje główne okno, ale nie mam pojęcia, jak należy zrobić ikonę SysTray i ukryć okno główne (to też oznacza, że ​​gdy użytkownik minimalizuje okno, powinno ono minimalizować się do zasobnika, a nie do paska zadań).

Jakieś wskazówki?

Michael Stum
źródło
3
Dzięki za wszystkie sugestie! WPF-NotifyIcon jest tym, z czym pójdę, ponieważ szybki test pokazuje, że jest całkiem obiecujący i bezbolesny.
Michael Stum

Odpowiedzi:

114

Nie ma NotifyIcon dla WPF.

Mój kolega korzystał z tej ogólnodostępnej biblioteki z dobrym skutkiem:

Drew Noakes
źródło
2
Fantastyczna biblioteka. Nie mogę się doczekać, aby go wykorzystać!
Rob Hay
2
Drew, wydaje się, że łącze zniknęło tutaj. Czy masz alternatywny link do tej biblioteki? Zrobiłem szybkie wyszukiwanie, ale nie mogłem określić, czy wyniki dotyczą tego samego projektu.
Brad Larson
@BradLarson, witryna wydaje się być wyłączona; ale tak czy inaczej projekt jest dostępny jako pakiet Nuget (patrz odpowiedź Dale'a)
Thomas Levesque
4
Pomimo dużej liczby głosów ta odpowiedź nie stanowi użytecznej, uzasadnionej odpowiedzi na temat przepełnienia stosu. W rzeczywistości jest to odpowiedź zawierająca tylko łącze, w przeciwieństwie do standardów Stack Overflow. Proszę poprawić tę odpowiedź, podając konkretne, istotne informacje w samej odpowiedzi. Zapewni to dostępność informacji niezależnie od statusu witryny zewnętrznej.
Evan Larsen
107

Musisz użyć kontrolki NotifyIcon z System.Windows.Forms lub alternatywnie możesz użyć interfejsu Notify Icon API dostarczanego przez Windows API. WPF nie zapewnia takiego odpowiednika i został kilkakrotnie zażądany w witrynie Microsoft Connect.

Mam kod na GitHub, który używa System.Windows.Formskomponentu NotifyIcon z poziomu aplikacji WPF, kod można obejrzeć na https://github.com/wilson0x4d/Mubox/blob/master/Mubox.QuickLaunch/AppWindow.xaml.cs

Oto podsumowanie:

Utwórz okno WPF z ShowInTaskbar = False, które jest ładowane w niewidocznym stanie.

Na poziomie klasy:

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

Podczas OnInitialize ():

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

Podczas OnLoaded ():

notifyIcon.Visible = true;

A do interakcji (pokazane powyżej jako notifyIcon.Click i DoubleClick):

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

Z tego miejsca możesz wznowić korzystanie z kontrolek WPF i interfejsów API, takich jak menu kontekstowe, wyskakujące okienka itp.

To takie proste. Nie potrzebujesz dokładnie okna WPF do hostowania komponentu, jest to po prostu najwygodniejszy sposób wprowadzenia go do aplikacji WPF (ponieważ okno jest ogólnie domyślnym punktem wejścia zdefiniowanym przez App.xaml), podobnie nie robisz tego. Potrzebujesz opakowania WPF lub formantu innej firmy, ponieważ komponent SWF jest obecny w każdej instalacji .NET Framework, która również obsługuje WPF, ponieważ jest częścią .NET Framework (na której opierają się wszystkie obecne i przyszłe wersje .NET Framework). Do chwili obecnej Microsoft nic nie wskazuje na to, że obsługa SWF zostanie wkrótce usunięta z .NET Framework.

Mam nadzieję, że to pomoże.

To trochę serdeczne, że musisz użyć komponentu Framework starszego niż 3.0, aby uzyskać ikonę w zasobniku, ale zrozumiałe, jak wyjaśnił to Microsoft, nie ma koncepcji zasobnika systemowego w zakresie WPF. WPF to technologia prezentacji, a ikony powiadomień to koncepcja systemu operacyjnego (nie „prezentacji”).

Shaun Wilson
źródło
2
Dzięki za szczegółowe wyjaśnienie!
Michael Stum
4
+1, powinna to być wybrana odpowiedź na samo wyjaśnienie.
ToastyMallows
2
Uznanie za ostatni akapit. To było dokładnie to, co chciałem wiedzieć, i jest to poziom prostych, wnikliwych szczegółów, które trąci dobrym programistą.
Matthew Layton
1
Zabawną częścią tego ostatniego akapitu jest to, że „WPF to tylko Windows” jest teraz wymówką Microsoftu, aby nie tworzyć wieloplatformowego WPF na .NET Core. Czyli jest to tylko system Windows, ale nie tylko system Windows, aby udostępnić funkcje specyficzne dla systemu Windows?
McGuireV10
1
Jestem jedynym, który nie lubi odwołań do System.Windows.Forms w mojej aplikacji WPF?
Joel
48

Niedawno miałem ten sam problem. Niestety NotifyIcon jest obecnie tylko kontrolką Windows.Forms, jeśli chcesz z niej skorzystać, będziesz musiał uwzględnić tę część frameworka. Myślę, że to zależy od tego, jak bardzo jesteś purystą WPF.

Jeśli chcesz szybkiego i łatwego sposobu rozpoczęcia pracy, zapoznaj się z tym formantem WPF NotifyIcon w projekcie Code, który w ogóle nie opiera się na NotifyIcon WinForms. Wydaje się, że nowsza wersja jest dostępna w witrynie internetowej autora i jako pakiet NuGet . Jak dotąd wydaje mi się, że jest to najlepsza i najczystsza droga.

  • Rich ToolTips zamiast tekstu
  • Menu kontekstowe i wyskakujące okienka WPF
  • Wsparcie poleceń i zdarzenia kierowane
  • Elastyczne wiązanie danych
  • Bogate komunikaty w dymkach zamiast komunikatów domyślnych dostarczanych przez system operacyjny

Sprawdź to. Zawiera również niesamowitą przykładową aplikację, bardzo łatwą w użyciu, i możesz mieć świetnie wyglądające wyskakujące okienka WPF, podpowiedzi i menu kontekstowe w stylu Windows Live Messenger. Idealny do wyświetlania kanału RSS, używam go w podobnym celu.

Dołek
źródło
5
dla nowicjuszy w 2017, ten pakiet nuget
mcy