Aplicación WPF que solo tiene un icono de bandeja

144

Soy un novato total de WPF y me pregunto si alguien podría darme algunos consejos sobre cómo escribir una aplicación que comienza minimizada en la bandeja. La idea es que periódicamente busque una fuente RSS y cree una ventana emergente de tostadora cuando haya nuevas fuentes.

La aplicación aún debe tener una ventana principal (esencialmente solo una lista que contiene todas las entradas de feed), pero eso debe estar oculto de forma predeterminada.

He comenzado a leer sobre XAML y WPF y sé que StartupUri en la App.xaml tiene que apuntar a mi ventana principal, pero no tengo idea de cuál es la forma correcta de hacer el icono de SysTray y ocultar la ventana principal (esto también significa que cuando el usuario minimiza la ventana, debe minimizar a la bandeja, no a la barra de tareas).

¿Alguna pista?

Michael Stum
fuente
3
¡Gracias por todas las sugerencias! El WPF-NotifyIcon es con lo que iré, ya que una prueba rápida muestra que es bastante prometedor e indoloro.
Michael Stum

Respuestas:

114

No hay NotifyIcon para WPF.

Un colega mío usó esta biblioteca de libre acceso con buenos resultados:

Drew Noakes
fuente
2
Fantástica biblioteca. No puedo esperar para utilizarlo!
Rob Hay
2
Drew, el enlace parece haberse apagado aquí. ¿Tiene un enlace alternativo para esta biblioteca? Hice una búsqueda rápida, pero no pude determinar si los resultados fueron para el mismo proyecto.
Brad Larson
@BradLarson, el sitio parece estar inactivo; pero de todos modos el proyecto está disponible como paquete Nuget (ver la respuesta de Dale)
Thomas Levesque
44
A pesar de la gran cantidad de votos, esta respuesta no constituye una respuesta útil y legítima de desbordamiento de pila. Es efectivamente una respuesta de solo enlace, contrario a los estándares de desbordamiento de pila. Mejore esta respuesta proporcionando la información material específica en la respuesta misma. Esto asegurará que la información esté disponible independientemente del estado del sitio externo.
Evan Larsen
107

Debe usar el control NotifyIcon de System.Windows.Forms, o también puede usar la API de icono de notificación proporcionada por la API de Windows. WPF no proporciona dicho equivalente, y se ha solicitado en Microsoft Connect varias veces.

Tengo un código en GitHub que usa el System.Windows.Formscomponente NotifyIcon desde una aplicación WPF, el código se puede ver en https://github.com/wilson0x4d/Mubox/blob/master/Mubox.QuickLaunch/AppWindow.xaml.cs

Aquí están los bits de resumen:

Cree una ventana WPF con ShowInTaskbar = False, y que se cargue en un estado no visible.

A nivel de clase:

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

Durante OnInitialize ():

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

Durante OnLoaded ():

notifyIcon.Visible = true;

Y para la interacción (se muestra como notifyIcon.Click y DoubleClick arriba):

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

Desde aquí, puede reanudar el uso de controles WPF y API, como menús contextuales, ventanas emergentes, etc.

Es así de simple. No necesita exactamente una ventana WPF para alojar el componente, es la forma más conveniente de introducir una en una aplicación WPF (ya que una ventana es generalmente el punto de entrada predeterminado definido a través de App.xaml), del mismo modo, usted no ' No necesita un WPF Wrapper o un control de terceros, ya que el componente SWF está garantizado en cualquier instalación de .NET Framework que también tenga soporte WPF ya que es parte de .NET Framework (sobre el cual se basan todas las versiones actuales y futuras de .NET Framework). Hasta la fecha, no hay ninguna indicación de Microsoft de que la compatibilidad con SWF se eliminará de .NET Framework en el corto plazo.

Espero que ayude.

Es un poco complicado tener que usar un Componente Framework anterior a 3.0 para obtener un icono de bandeja, pero es comprensible que Microsoft lo haya explicado, no existe un concepto de Bandeja del sistema dentro del alcance de WPF. WPF es una tecnología de presentación, y los iconos de notificación son un concepto de sistema operativo (no una "presentación").

Shaun Wilson
fuente
2
¡Gracias por la explicación detallada!
Michael Stum
44
+1, esta debería ser la respuesta seleccionada solo para la explicación.
ToastyMallows
2
Felicitaciones por ese último párrafo. Eso era exactamente lo que necesitaba saber, y es este nivel de detalle simple y perspicaz lo que huele a un buen desarrollador.
Matthew Layton
1
La parte divertida de ese último párrafo es "WPF es solo para Windows" es ahora la excusa de Microsoft para no hacer WPF multiplataforma en .NET Core. Entonces, ¿es solo de Windows, pero no solo de Windows lo suficiente como para exponer características específicas de Windows?
McGuireV10
1
¿Soy el único a quien no le gustan las referencias a System.Windows.Forms en mi aplicación WPF?
Joel
48

Recientemente tuve este mismo problema. Desafortunadamente, NotifyIcon es solo un control de Windows.Forms en este momento, si desea usarlo, tendrá que incluir esa parte del marco. Supongo que eso depende de lo purista de WPF que seas.

Si desea una forma rápida y fácil de comenzar, eche un vistazo a este control NotifyIcon de WPF en el Proyecto de Código que no depende en absoluto de NotifyIcon de WinForms. Una versión más reciente parece estar disponible en el sitio web del autor y como un paquete NuGet . Esta me parece la mejor y más limpia forma hasta ahora.

  • Rich ToolTips en lugar de texto
  • Menús contextuales y ventanas emergentes de WPF
  • Soporte de comando y eventos enrutados
  • Enlace de datos flexible
  • Mensajes de globo enriquecidos en lugar de los mensajes predeterminados proporcionados por el SO

Echale un vistazo. También viene con una aplicación de muestra increíble, muy fácil de usar, y puedes tener ventanas emergentes WPF de estilo Windows Live Messenger, información sobre herramientas y menús contextuales. Perfecto para mostrar un feed RSS, lo estoy usando para un propósito similar.

Valle
fuente
55
para los recién llegados en 2017, ese paquete nuget está obsoleto pero se ha publicado con un nombre diferente como nuget.org/packages/Hardcodet.NotifyIcon.Wpf
mcy