En mi "post" del día 31 de agosto (Cómo utilizar los estilos visuales de Windows XP) explicaba cómo habilitar los estilos visuales de Windows XP en aplicaciones Windows Forms con la versión 1.1 de la plataforma .NET. Por los comentarios que he recibido estos últimos días deduzco que vendría bien dar algunos consejos más.
En concreto me han planteado las siguientes dudas:
1.- ¿Tengo que tener todos los controles con FlatStyle = System?
Sí. Es necesario o sino no se verán con el estilo de Windows XP. Así que no queda más remedio que fijar esta propiedad en todos los controles que dispongan de ella.
2.- Menudo aburrimiento recorrer uno por uno los controles para fijar esta propiedad... ¿Puedo hacer otra cosa?
Sí, puedes automatizar esta tarea. Me he tomado la libertad de escribir una pequeña rutina que hará precisamente esto. La he escrito en Visual Basic por probarla en un proyecto que estamos haciendo ahora en la empresa y que es en este lenguaje, pero traducirla a C# no reviste dificultad alguna:
Class clsVisualStyles
Private Sub New()
'No hace nada. Lo creo así, privado, para que no se pueda instanciar
End Sub
'Cambia los estilos de botones, etiquetas y grupos (y derivados) para que se adapten a Visual Styles de Windows XP
'Hay otros controles que se adaptan automáticamente
Public hared Sub ChangeFlatStyle(ByVal frm As Control)
Dim ctl As Control
For Each ctl In frm.Controls
If TypeOf ctl Is ButtonBase Then
CType(ctl, ButtonBase).FlatStyle = Windows.Forms.FlatStyle.System
ElseIf TypeOf ctl Is Label Then
CType(ctl, Label).FlatStyle = Windows.Forms.FlatStyle.System
ElseIf TypeOf ctl Is GroupBox Then
CType(ctl, GroupBox).FlatStyle = Windows.Forms.FlatStyle.System
End If
�� 'Si el objeto es contenedor llamamos a esta misma función recursivamente
If ctl.Controls.Count > 0 Then ChangeFlatStyle(ctl)
Next
End Sub
End Class
De este modo sólo es necesario llamar a este método estático desde el método InitializeComponent o desde el evento Load de cualquier formulario pasándole un referencia a si mismo:
clsVisualStyles.ChangeFlatStyle(Me)
Se recorrerán todos sus controles y los hijos de éstos recursivamente (gracias Germán por hacérmelo notar) para modificar su propiedad FlatStyle. Dado que no todos los controles disponen de dicha propiedad es necesario hacerlo de esta forma ya que sólo los controles que heredan de ButtonBase, Label o GroupBox la poseen. Si a alguien se le ocurre un método mejor agradecería mucho que me lo hiciese llegar.
3.- ¿Y cómo hago para habilitar los estilos si uso la versión 1.0 de .NET?
En el anterior "post" ya apuntaba la forma de hacerlo: mediante un archivo '.manifest' con el nombre de nuestra aplicación. Por ejemplo, si disponemos de una aplicación llamada 'MiApplicacion.exe' y queremos que obtenga los estilos visuales de XP debemos crear un archivo de texto de nombre 'MiAplicacion.exe.manifest' cuyo contenido debe ser análogo al siguiente:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
name="CryptDecrypt
Util"
processorArchitecture="x86"
version="1.0.1689.32606"
type="win32"
/>
<description>Utilidad
de criptografía de KWAF</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
He marcado en rojo las etiquetas que hay que cubrir obligatoriamente con el valor adecuado y en granate las que son opcionales pero de exisitr deberíamos cubrir de forma adecuada. Su significado es evidente.
OJO: No llega sólo con crear este archivo y copiarlo a la carpeta de la aplicación. Al igual que en el caso de la versión 1.1 es necesario cambiar la propiedad FlatStyle de los controles a System o no se verán los estilos visuales, por lo que la clase del punto 2 resultará igual de mucha utilidad.