Minimizar Aplicación Notify Icon – WPF


Voy a mostrarles como hacer que una aplicación de WPF pueda ser minimizada en la barra de Notificaciones y permitir enviar notificaciones, al estilo Messenger, los Antivirus o cualquier otra aplicación.

En WPF aún no hay un control que permita hacer esto, para poder hacerlo es necesario usar el Control NotifyIcon de Windows Forms, por lo que hay que adicionar la referencia de System.Windows.Forms.

Para empezar, usamos cualquier aplicación de WPF, luego adicionamos la referencia de System.Windows.Forms y la de System.Drawing para poder cargar el icono:

También es necesario adicionar un archivo *.Ico, que será el icono en la barra, después de adicionar el icono al proyecto, se debe modificar las propiedades para que sea “Embedded Resource”, ya que este es el que usa Windows Forms,  y además que se copie si no existe.

Modificamos las propiedades de la Ventana en XAML para asignarle los eventos necesarios:

<Window x:Class="IconoNotificacion.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" StateChanged="Window_StateChanged"  IsVisibleChanged="Window_IsVisibleChanged">

Ahora creamos nuestras variables y los eventos:

System.Windows.Forms.NotifyIcon iconoNotificacion;

public MainWindow()
{
   InitializeComponent();
   iconoNotificacion = new System.Windows.Forms.NotifyIcon();
   iconoNotificacion.BalloonTipText = "La Aplicación se encuentra ejecutando";
   iconoNotificacion.BalloonTipTitle = "Demo Icono Notificación";
   iconoNotificacion.Text = "Presione Click para Mostrar";
   iconoNotificacion.Icon = new System.Drawing.Icon("warn.ico");
   iconoNotificacion.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
   iconoNotificacion.Click += new EventHandler(iconoNotificacion_Click);
}

void iconoNotificacion_Click(object sender, EventArgs e)
{
   Show();
   WindowState = System.Windows.WindowState.Normal;
}

private void Window_StateChanged(object sender, EventArgs e)
{
   if (WindowState == WindowState.Minimized)
   {
     Hide();
     if (iconoNotificacion != null)
          iconoNotificacion.ShowBalloonTip(2000);
   }
}

private void Window_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
   VerificarIcono();
}

void VerificarIcono()
{
   MostrarIcono(!IsVisible);
}

void MostrarIcono(bool mostrar)
{
   if (iconoNotificacion != null)
        iconoNotificacion.Visible = mostrar;
}

Al NotifyIcon Se le modifican propiedades que nos servirán para mostrar el texto del globito, el titulo, el texto cuando se pasa el Mouse por el Icono, el Icono del Mensaje del globo y el Icono que va a tener en la barra

Ahora si ejecutamos, y minimizamos la aplicación veremos:

 

Si hacemos clic sobre el Icono, la aplicación nuevamente se vuelve a mostrar.

Adicionar un Menú al Icono

Como el control es de Windows.Forms, tenemos que crear un ContextMenu también de Windows Forms, modificamos el código en C# :

//iconoNotificacion.Click += new EventHandler(iconoNotificacion_Click);

System.Windows.Forms.ContextMenu menu = new System.Windows.Forms.ContextMenu();
System.Windows.Forms.MenuItem item1 = new System.Windows.Forms.MenuItem("Mostrar");
item1.Click += new EventHandler(item1_Click);
System.Windows.Forms.MenuItem item2 = new System.Windows.Forms.MenuItem("Info");
item2.Click += new EventHandler(item2_Click);
System.Windows.Forms.MenuItem item3 = new System.Windows.Forms.MenuItem("Cerrar");
item3.Click += new EventHandler(item3_Click);
menu.MenuItems.Add(item1);
menu.MenuItems.Add(item2);
menu.MenuItems.Add(item3);
iconoNotificacion.ContextMenu = menu;
}

void item3_Click(object sender, EventArgs e)
{
  Close();
}

void item2_Click(object sender, EventArgs e)
{
  MessageBox.Show("Demo Icono de Notificación - https://escarbandocodigo.wordpress.com/");
}

void item1_Click(object sender, EventArgs e)
{
  Show();
  WindowState = System.Windows.WindowState.Normal;
}

Para poder ver bien el ejemplo, se comentó la parte donde se adiciona el evento del click en el Icono, ahora para mostrar la aplicación se debe usar el Menú “Mostrar”:

 

Lanzar Notificaciones

Podemos programar nuestra aplicación para que si ocurre algo y la aplicación se encuentra en la barra de Notificaciones, se envié una notificación al Usuario:

En este ejemplo, adicioné un DispatcherTimer para que cada 5 segundos se envié la notificación:

iconoNotificacion.ContextMenu = menu;
System.Windows.Threading.DispatcherTimer t = new System.Windows.Threading.DispatcherTimer();
t.Interval = TimeSpan.FromSeconds(5);
t.Tick += new EventHandler(t_Tick);
t.Start();
}

void t_Tick(object sender, EventArgs e)
{
  if (WindowState == WindowState.Minimized)
  {
   iconoNotificacion.BalloonTipText = "Se ha lanzado una notificación";
   iconoNotificacion.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Warning;
   if (iconoNotificacion != null)
        iconoNotificacion.ShowBalloonTip(2000);
   }
}

 

10 pensamientos en “Minimizar Aplicación Notify Icon – WPF

    • Hola, para adicionarle icono al menú es fácil, hay que usar un ContextMenuStrip en vez de ContextMenu, y luego adicionar los items con su icono, ejemplo para que se vea con icono:

      System.Windows.Forms.ContextMenuStrip menu2 = new System.Windows.Forms.ContextMenuStrip();
      Icon icon1 = new Icon(SystemIcons.Exclamation, 40, 40);
      Bitmap bmp = icon1.ToBitmap();
      System.Windows.Forms.ToolStripMenuItem itemt1 = new System.Windows.Forms.ToolStripMenuItem(“Mostrar”, bmp);

      menu2.Items.Add(itemt1);
      itemt1.Click += new EventHandler(item1_Click);
      iconoNotificacion.ContextMenuStrip = menu2;
      Al reemplazar, ya queda el menú con iconos🙂

Deseas comentar o sugerir algo?

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s