July 2008 - Posts

Sun ha desarrollado un software para virtualizar sistemas, lo han llamado
VirtualBox. Por supuesto, siguiendo la filosofía de la empresa es open source y por supuesto multiplataforma. Se puede ejecutar en Windows, Linux, Macintosh (aún en beta), Solaris y soporta también una gran variedad de sistemas invitados como Windows (NT 4.0, 2000, XP, Server 2003, Vista), DOS/Windows 3.x, Linux (2.4 and 2.6), y OpenBSD.

Para estar informado del producto visitar el blog.
Para descargar aquí.
Para documentación aquí.
En este post veremos como conseguir que, al minimizar una aplicación WPF, en vez de mostrarse en el área de aplicaciones minimizadas se muestre en el área de la bandeja de iconos. Realmente es muy sencillo pero en WPF no existe un control específico para ello, con lo que tenemos que volver a utilizar la interorperabilidad con Windows Forms.

Para ello lo primero que debemos hacer es agregar las referencias System.Windows.Forms y System.Drawning. La segunda la utilizaremos para especificar el icono que queremos mostrar en la barra de iconos.

Aquí paso a paso el código.
El proceso sería:
1. Declaramos a nivel principal una variable del tipo NotifyIcon.
Class Window1
Dim _TrayIcon As New System.Windows.Forms.NotifyIcon
2. En el evento de inicialización del formulario asignamos las propiedades al objeto NotifyIcon. Además crearemos un disparador para el evento Click del Notify.
Private Sub Window1_Initialized(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Initialized
' CREA ICONTRAY
_TrayIcon.BalloonTipText = "Aplicación minimizada. Click aquí para restaurar"
_TrayIcon.BalloonTipTitle = "Título Tray"
_TrayIcon.Text = "texto"
_TrayIcon.Icon = New System.Drawing.Icon("Resources\Application.ico")
AddHandler _TrayIcon.Click, AddressOf _TrayIcon_Click
End Sub
3. Capturamos el evento Minimizar del formulario y mostramos el NotifyIcon.
Private Sub Window1_StateChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.StateChanged
If Me.WindowState = Windows.WindowState.Minimized Then
' SI SE MINIMIZA EL FORM LO OCULTA Y MUESTRA ICONTRAY
Me.Hide()
_TrayIcon.Visible = True
_TrayIcon.ShowBalloonTip(2000)
End If
End Sub
4. Capturamos el evento Click del NotifyIcon para que al producirse restaure la aplicación.
Private Sub _TrayIcon_Click(ByVal sender As Object, ByVal e As System.EventArgs)
' AL HACER CLICK EN ICONTRAY RESTAURA Y MUESTRA FORM
_TrayIcon.Visible = False
Me.Show()
Me.WindowState = Windows.WindowState.Normal
End Sub
End Class
5. Al cerrar el formualario destruimos el objeto NotifyIcon.
Private Sub Window1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
' AL CERRAR FORM LIBERA RECURSOS DEL ICONTRAY
_TrayIcon.Dispose()
_TrayIcon = Nothing
End Sub
Con esto conseguimos el mismo funcionamiento en WPF del NotifyIcon del espacio de nombres System.Windows.Forms.
Esto va a ser un minipost, porque averiguar qué formularios tenemos abiertos en una aplicación es tan fácil como usar la clase System.Windows.Forms.Application.OpenForms, devuelve una colección de tipo Form con los formularios abiertos. Haciendo un bucle como el del ejemplo podremos manipularlos.
Dim _Form As Form
For Each _Form In System.Windows.Forms.Application.OpenForms
...
Next
¿No te ha pasado alguna vez publicar un sitio web con el debug a true o las trazas habilitadas? Es un tipico descuido que se da al subir aplicaciones a un servidor en producción. Evidentemente, a la hora de desarrollar es lógico tener las trazas habilitadas o el debuger habilitado. Lo que no es nada saludable es dejarlos activados en producción. ¿Qué diferencias hay entre tener esto habilitado o no?
- La compilación de las páginas toma más tiempo.
- El código se ejecuta de forma más lenta.
- Se necesita más memoria en tiempo de ejecución.
- Los scripts y las imágenes no se cachean.
Si quieren más información al respecto, visitar
este artículo de Scott Guthrie. Pero al grano, cómo evitar estos descuidos.
La solución la tenemos en la configuración del servidor de producción. Concretamente en el elemento
deployment. Para ello modificaremo el fichero
machine.config, recordar que es el del servidor de producción. Introduciremos el siguiente código, dentro del elemento configuración y system.web:
<configuration>
<system.web>
<deployment retail=”true”/>
</system.web>
</configuration>
Con esto conseguiremos que la configuración del servidor prevalezca a la de la aplicación en cuanto a cómo se ejecuta la misma. En este caso, el deployment retail en true indicará que todas las aplicaciones están en modo producción.
Por mi experiencia les aconsejo que usen este simple código para evitar quejas de los clientes o usuarios finales.