Otros controles.

Además de los controles comunes vistos anteriormente, WPF dispone de multitud de controles que usarás en tus aplicaciones. No es mi intención explicarlos todos, sino ver unos cuantos más sólo un poco por encima. Debes ser tú el que experimente a fondo con ellos y familiarizarte con sus propiedades.

Control 'PasswordBox', caja de contraseña.

Es muy similar al control 'TextBox', pero su funcionalidad está dirigida a la introducción de contraseñas. Es por ello que por defecto no visualiza el texto introducido, sino una máscara de caracteres que mantienen oculto el verdadero contenido tecleado.

<PasswordBox Height="20" Width="200"/>

Ejecuta la aplicación y observa la máscara de caracteres que impiden ver la contraseña. A continuación modifica el código XAML de la siguiente manera y vuelve a ejecutar la aplicación y observa el cambio; ahora el carácter de la máscara de caracteres la hemos cambiado al carácter '#'.

<PasswordBox Height="20" Width="200" PasswordChar="#"/>

En el control 'TextBox' usábamos la propiedad 'Text' para obtener el contenido que se había tecleado en el control. En este caso, la propiedad 'Text' no existe, sino que debemos hacer uso de la propiedad 'Password' para acceder a la cadena de texto que representa la contraseña introducida.

Control 'RichTextBox', o caja de texto enriquecida.

Es como una caja de texto pero permite muchas más funcionalidades, especialmente las relacionadas con el formato de texto de su contenido. Este control puede ser complicado de manejar al principio, y su explicación sería muy extensa. Quédate con la idea de que permite la introducción de texto en varias líneas, aceptando caracteres como salto de carro y tabulación, formatos de fuente de letras y colores de las mismas, etc. No quiero entrar a fondo en este control porque antes de ello deberías estudiar clases que son necesarias para su uso, como la clase 'TextRange'. Sin embargo, te animo a que revises la documentación de Microsoft respecto de este control y experimentes con él.

Control 'ListBox', o caja de lista.

Ya vimos el control 'ComboBox', que permitía la selección de uno de sus items al accionar su lista desplegable. 'ListBox' también permite la selección de sus items pero sin desplegable, simplemente mostrándolos uno detrás de otro.

<ListBox Height="200" Width="200">
    <ListBox.Items>
        <ListBoxItem Content="item 1"/>
        <ListBoxItem Content="item 2"/>
        <ListBoxItem Content="item 3"/>
    </ListBox.Items>
</ListBox>

Control 'ToggleButton', o botón conmutador.

En casi todos los aspectos es como un control 'Button', pero se diferencia de él en que puede tener dos estados: pulsado y no pulsado. Estos dos estados se manifestarán en la apariencia visual del control según haya sido pulsado o no, intercambiando el tipo de visualización a cada pulsación. Para distinguir entre los dos estados este control dispone de la propiedad 'IsChecked', que acepta o devuelve un valor 'bool' según sea su estado.

Control 'CheckBox', o caja de chequeo.

Muy parecido al anterior en cuanto a su funcionalidad, pues posee la misma propiedad 'IsChecked' que nos permite obtener o establecer el estado de si está "chequeado" o "no chequeado". Sin embargo, en su visualización es muy diferente. Modifica el código XAML y ejecuta la aplicación:

<CheckBox Content="caja de chequeo" IsChecked="True"/>

Comprueba su funcionamiento haciendo click en él. A cada cambio de estado se producirá un cambio en el valor 'bool' de su propiedad 'IsChecked'.

Control 'Menu'.

Estamos hablandoo del menú típico que nos encontramos en la parte superior de casi cualquier aplicación. Dispone de una colección de items personificados en controles 'MenuItem' que tendrán el verdadero contenido del menú.

<Menu>
    <MenuItem Header="menu 1"/>
    <MenuItem Header="menu 2">
        <MenuItem Header="menu 21"/>
        <MenuItem Header="menu 22"/>
    <MenuItem/>
</Menu>

Como puedes ver, cada 'MenuItem' puede tener a su vez como contenido otros controles 'MenuItem', lo que permite elaborar un menú verdaderamente completo según las necesidades de la aplicación.

Control 'StatusBar', o barra de estado.

Al igual que el control 'Menu', una barra de estado es común en la mayoría de las aplicaciones, pero su colocación suele ser en la parte más baja de la ventana. Puede contener también una colección de items que proporcionen información adicional al usuario, como la hora del sistema, el estado de grabación o actualización de datos de configuración o de pantalla, etc., cualquier cosa que se te ocurra que puede ser información de importancia para el usuario. Es normal separar los items de una barra de estado con un control 'Separator'. Será buena idea que como contenedor principal de la ventana tengas un control 'DockPanel' y que la barra de estado tenga la propiedad 'DockPanel.Dock' con valor 'Bottom'.

Control 'ToolBar', o barra de herramientas.

Como la barra de estado, pero con localización en la parte superior de la ventana, bajo el menú, como es la forma más habitual de encontrarla en la mayoría de las aplicaciones. También puede contener una colección de items, y también es lógico colocarla dentro de un 'DockPanel' pero con la propiedad 'DockPanel.Dock' con valor 'Top'. Un ejemplo es cualquier editor de textos, que posee una barra de herramientas en la que están los controles que actúan sobre el texto que estamos escribiendo, su formato, color, estilos, etc.

Control 'Slider', o deslizador.

Imagina una aplicación basada en reproducción de música y/o vídeo. Un control principal que deberá tener será aquel que permita subir y bajar el volumen. Eso lo podemos hacer con el control Slider:

<Slider Width="100" Maximum="100" Minimum="0" Value="30"/>

Hemos definido un control 'Slider' con ancho de 100 píxeles, valor máximo de 100 y mínimo de 0, y con un valor actual de 30. Por defecto, el valor de la propiedad 'Value' será de cero. Evidentemente, este control tendrá 100 pasos, en cada uno de los cuales la propiedad 'Value' cambiará de valor.

Control 'ProgressBar', o barra de progreso.

La barra de progreso suele utilizarse cuando una aplicación está ejecutando una tarea en segundo plano y deseamos mostrar el progreso de la misma, como por ejemplo al guardar o cargar datos. El funcionamiento de la barra de progreso suele ir acompañado de una tarea que se ejecuta en C# bajo la supervisión de una clase llamada 'BackgroundWorker' o bajo la supervisión de otro hilo distinto. Como ya deberías haber hecho el curso C#, no deberías tener problemas para utilizar la barra de progreso asociada a una tarea ejecutándose en otro hilo, así que no voy a entrar en detalles. Ejecuta el siguiente código XAML y verás su similitud con el control 'Slider'.

<ProgressBar Height="30" Width="200" Maximum="100" Minimum="0" Value="30"/>

También podemos establecer la barra de progreso de modo indeterminado en el caso de no querer controlar el progreso que se está ejecutando en segundo plano:

<ProgressBar Height="30" Width="200" IsIndeterminate="True"/>

Control 'Calendar', o calendario.

Es un control muy completo para la visualización y selección de calendarios. Es importante que experimentes con sus propiedades, pues tiene algunas de especial interés, como son 'DisplayMode', 'SelectedDate', 'SelectionMode' y otras.

Control 'DatePicker', o selector de fechas.

Con la misma finalidad que el control 'Calendar', 'DatePicker' nos muestra una visualización mucho más reducida que, además de actuar sobre un calendario desplegable, nos permite ingresar la fecha directamente con el teclado.

Control 'DataGrid', o rejilla de datos.

El control de manejo más difícil, sin duda. Al principio cuesta un poco, pero es importantísimo controlarlo a la perfección porque es el mejor control para la visualización de datos en tabla, por ejemplo una consulta sobre una base de datos, que es su tarea más habitual en las aplicaciones. Es mi intención abordarlo con el tema de enlace de datos, asi que no quiero profundizar el él de momento.