2009-09-24 15 views
118

Soy un novato total de WPF y me pregunto si alguien podría darme algunos consejos sobre cómo escribir una aplicación que comience minimizada a la bandeja. La idea es que recupera periódicamente un RSS Feed y crea un Toaster-Popup cuando hay nuevos feeds.WPF Aplicación que solo tiene un ícono de bandeja

La aplicación aún debe tener una ventana principal (esencialmente solo una lista que contiene todas las entradas de entrada), pero debe estar oculta por defecto.

He comenzado a leer acerca de XAML y WPF y sé que StartupUri en 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 el principal ventana (esto también significa que cuando el usuario minimiza la ventana, debe minimizar a la bandeja, no a la barra de tareas).

¿Alguna pista?

+3

¡Gracias por todas las sugerencias! El WPF-NotifyIcon es lo que voy a hacer, ya que una prueba rápida muestra que es bastante prometedor e indolora. –

Respuesta

94
+1

Fantástica biblioteca. No puedo esperar para utilizarlo! –

+2

Drew, el enlace parece haber muerto aquí. ¿Tienes un enlace alternativo para esta biblioteca? Hice una búsqueda rápida, pero no pude determinar si los resultados fueron para el mismo proyecto. –

+0

@BradLarson, el sitio parece estar inactivo; pero de todos modos, el proyecto está disponible como paquete Nuget (ver la respuesta de Dale) –

47

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 framework. Supongo que eso depende de la cantidad de purista de WPF que seas.

Si desea una manera rápida y fácil de comenzar, consulte este WPF NotifyIcon control on the Code Project que no depende en absoluto de WinForms NotifyIcon. Una versión más reciente parece estar disponible on the author's website y como NuGet package. Esta parece ser la mejor y más limpia forma para mí hasta ahora.

información sobre herramientas
  • ricos en lugar de texto
  • WPF menús contextuales y ventanas emergentes
  • de apoyo Comando y enruta eventos
  • de datos flexible de unión
  • globos de mensajes ricos en lugar de los mensajes por defecto proporciona por el OS

Compruébalo. Viene con una aplicación de muestra increíble también, muy fácil de usar, y puedes tener ventanas emergentes de WPF de estilo de Windows Live Messenger muy atractivas, información sobre herramientas y menús contextuales. Perfecto para mostrar una fuente RSS, la estoy usando para un propósito similar.

+2

para los recién llegados en 2017, ese paquete nuget está obsoleto pero publicado bajo un nombre diferente como https://www.nuget.org/packages/Hardcodet.NotifyIcon.Wpf/ – mcy

77

Debe utilizar el control NotifyIcon de System.Windows.Forms o, alternativamente, puede usar la API Notify Icon proporcionada por la API de Windows. WPF no ofrece tal equivalente, y se ha solicitado en Microsoft Connect varias veces.

tengo código en GitHub que utiliza System.Windows.Forms NotifyIcon de componentes desde una aplicación de WPF, el código se puede ver en https://github.com/wilson0x4d/Mubox/blob/master/Mubox.QuickLaunch/AppWindow.xaml.cs

Éstos son los bits de resumen:

crear una ventana de WPF con ShowInTaskbar = False, y que está cargado en un estado no visible.

En clase de nivel:

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 (mostrado como notifyIcon.Click y DoubleClick arriba):

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

Desde aquí se puede reanudar el uso de los controles y las API de WPF como los menús de contexto, ventanas pop-up, etc.

es así de simple. No necesita exactamente una ventana WPF para alojar el componente, es la forma más conveniente de introducir uno en una aplicación WPF (como una ventana es generalmente el punto de entrada predeterminado definido a través de App.xaml), del mismo modo, no lo hace Necesito WPF Wrapper o 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, Microsoft no indica que el soporte de SWF se eliminará de .NET Framework en el corto plazo.

Espero que ayude.

Es un poco de queso que tiene que usar un componente de marco anterior a la 3.0 para obtener un icono de bandeja, pero comprensiblemente, como Microsoft lo ha explicado, no existe el concepto de una 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").

+2

¡Gracias por la explicación detallada! –

+2

+1, esta debería ser la respuesta seleccionada solo para la explicación. – ToastyMallows

+1

Felicitaciones por el último párrafo. Eso era exactamente lo que necesitaba saber, y es este nivel de detalle simple y profundo que huele a un buen desarrollador. – series0ne

Cuestiones relacionadas