c# - hardcodet - Aplicación WPF que solo tiene un icono de bandeja
hardcodet wpf taskbarnotification (3)
Soy un novato total de WPF y me pregunto si alguien podría darme algunos consejos sobre cómo escribir una aplicación que se inicie al mínimo en la bandeja. La idea es que recupera periódicamente un RSS Feed y crea un Toaster-Popup cuando hay nuevos feeds.
La aplicación aún debe tener una ventana principal (esencialmente solo una lista que contiene todas las entradas de fuentes), pero debe estar oculta de forma predeterminada.
Empecé 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 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).
¿Algún consejo?
No hay NotifyIcon para WPF.
Un colega mío usó esta biblioteca disponible gratuitamente con buenos resultados:
- http://www.hardcodet.net/wpf-notifyicon (publicación de blog)
- https://bitbucket.org/hardcodet/notifyicon-wpf/src (código fuente)
- https://www.nuget.org/packages/Hardcodet.NotifyIcon.Wpf/ (paquete NuGet)
- http://visualstudiogallery.msdn.microsoft.com/aacbc77c-4ef6-456f-80b7-1f157c2909f7/
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 control WPF NotifyIcon en Code Project que no depende en absoluto de WinForms NotifyIcon. Una versión más reciente parece estar disponible en el sitio web del autor y como paquete NuGet . Esta parece ser la mejor y más limpia forma para mí hasta ahora.
- Rich ToolTips en lugar de texto
- WPF menús contextuales y ventanas emergentes
- Soporte de comandos y eventos enrutados
- Enlace de datos flexible
- Los mensajes de globo enriquecido en lugar de los mensajes predeterminados proporcionan el sistema operativo
Echale un vistazo. 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.
Debe utilizar el control NotifyIcon desde 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 un código en GitHub que usa System.Windows.Forms
NotifyIcon Component 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 y API de WPF, como menús contextuales, ventanas emergentes, etc.
Es así de simple. No necesita exactamente una ventana de WPF para alojar el componente, es la forma más conveniente de introducirlo en una aplicación de 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 tienes que usar un Componente Marco anterior a la 3.0 para obtener un ícono 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").