Introducción:
Aquí tienes más cosas que debes saber si quieres convertir tu aplicación de
Windows.Forms en una de WinFX (WPF) o si simplemente quieres saber cómo hacer
las cosas que ya sabes hacer en una aplicación "normal" de .NET, pero que no
sabes cómo hacer eso mismo en una de WinFX o WPF (Windows Presentation
Foundation).
Seguramente en próximas ocasiones habrá más "conversiones", pero con estas de
aquí más las "equivalencias" que
publiqué la semana pasada, pues... ya tienes para ir
entreteniéndote... je, je.
Antes de empezar, quiero darte un link a una serie de "artículos" de
Jessica (AKA JFo) que tratan "más o menos" estos mismos temas, y que
seguramente te puede resultar interesante...
Getting started in WPF
(aún no he tenido tiempo de leerlo, así que... si algo de lo que digo aquí o
dije antes coincide con lo dicho en esos artículos... es pura coincidencia, ¡de
verdad!)
Las equivalencias entre WPF y .NET (segunda parte)
Pues eso, como ya te dije,
que esa propiedad es la que sirve para saber si un control está "checado" o no,
y como el tipo de datos de esa propiedad es Nullable(Of Boolean)
(Nullable<bool> en C#) para obtener el valor y usarlo para una asignación,
tendremos que usar IsChecked.Value.
En las aplicaciones de WPF, si queremos mostrar los cuadros de diálogo de
abrir o guardar (OpenFileDialog y SaveFileDialog),
debemos tener en cuenta que están definidos en el espacio de nombres
Microsoft.Win32 y que a diferencia de los que están definidos en
System.Windows.Forms (los que solemos usar en las aplicaciones de .NET normal),
el método ShowDialog devuelve True o False; en cuyo caso, False
es que se ha cancelado.
Cuando la ventana se minimiza, etc., se dispara el evento
StateChanged (antes era Resize).
Aunque antes de que se dispare ese evento, se dispara también el evento
LocationChanged.
En las ventanas (objetos de tipo Window) en las aplicaciones
WPF no existe el evento Move que es el que (al menos yo)
solemos usar para saber si se ha cambiado la posición de una ventana. En WPF hay
que usar el evento LocationChanged que por cierto, en los
formularios de Windows.Forms también existe.
Cuando "movemos" el elemento seleccionado en un ListView, para asegurarnos de
que ese elemento se muestre (porque esté más arriba o más abajo de los elementos
que se muestran), en las aplicaciones Windows.Forms tenemos que usar
EnsureVisible, pero en las aplicaciones WPF debemos usar
ScrollIntoView.
En ambos casos debemos asignar el índice del elemento que queremos que se
muestre, valor que debemos pasar como argumento a esos métodos.
En el ListView de Windows.Forms no se si existe esto... pero en el control
ListView de WPF puedes usar SelectedItems.Clear().
En WPF tendrás que usar Me.Topmost = True en lugar de Me.BringToFront()
Pues eso... parece una tontería, pero... en algunos casos te puede dar
"quebraderos" de cabeza, sobre todo si esos valores aún no están asignados (por
ejemplo mientras se carga la ventana principal), ya que el valor devuelto es...
bueno... cualquier cosa menos un número, je, je... experiméntalo por tu cuenta y
verás a que me refiero.
Pero no te asustes, solo te dará "problemas reales" si pretendes convertirlo
a cadena y aún no tiene un valor válido.
Pues eso... que si pretendes asignar el método de un evento "enrutado" (o
ruteado que dicen otros), en lugar de usar AddressOf método,
tendrás que usar New RoutedEventHandler(AddressOf método).
Normalmente hacemos todo el proceso de inicialización en el evento
Load del formulario (o
Loaded de la clase
Window de WPF), pero si es mucho lo que tienes que hacer, pues... verás que
parece una "chapuza", por ejemplo, si mueves el formulario de sitio o lo cambias
de tamaño, (para que use los valores de una ejecución anterior, por ejemplo). En
las pruebas que yo he hecho, si ese código de inicialización lo pongo en el
constructor (después de InitializeComponent), el resultado es más "fresco".
Aunque esto mismo en las aplicaciones de Windows.Forms no tienen el mismo
efecto, de hecho en las aplicaciones "normales" es posible que el formulario se
quede detrás del resto.
En las aplicaciones de Windows.Forms, usábamos Visible para
saber si un control estaba "a la vista" o si queríamos cambiar el estado de
visibilidad, pero en WPF esto ha cambiado.
En WPF, para saber si "algo" está visible o no, debemos usar la propiedad
IsVisible, que al ser de solo lectura, solo nos servirá para
saber si está o no visible. Si queremos cambiar "la visibilidad" de algún
control, debemos usar la propiedad Visibility que acepta los
tres valores de la enumeración del mismo nombre, y que pueden ser:
Visible, se muestra.
Hidden, se oculta, pero se le reserva el espacio que ocupa.
Collapsed, se oculta y no se le reserva espacio.
Eso de "reservar el espacio", bueno... debes probarlo, en este ejemplo de la
documentación de Visual Studio 2008 Beta 2 puedes ver el efecto (está en el
ejemplo de la enumeración Visibility):
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/fxref_presentationcore/html/40d66826-6e19-d0dd-b3b6-92a880399301.htm
En cualquier caso... el asignar un valor a la propiedad Visibility no te
asegura que "ocurra"... o eso dice la documentación, de hecho, en los
"formularios" actúa como le da la gana... en fin...
Para terminar este repaso de hoy a las equivalencias entre las aplicaciones
.NET "normales" y las de WPF, decirte algo que ya te dije en la página de la
utilidad
gsGenerarClaveSHA1: Utilidad para generar claves SHA1 para usar con
autenticación, y es sobre cómo acceder a un control o cualquier
otra cosa que se esté ejecutando en otro hilo desde un hilo diferente, por
ejemplo, desde el evento Elapsed de un temporizador.
En Visual Basic el código para acceder al método "miMétodo" sería este:
Me.Dispatcher.Invoke(DispatcherPriority.Normal, New InvocarCallback(AddressOf MiMétodo))
InvocarCallBack es un delegado que tendrá la misma firma que el método al que
queremos llamar, en caso de que no reciba ningún parámetro lo declararemos así:
Public Delegate Sub InvocarCallback()
Resumiendo que es gerundio
Pues esto es todo por hoy, aquí tienes el resumen de las 12 cosas que
contiene este artículo:
- El tipo de IsChecked es Boolean? (Nullable(Of
Boolean))
- El tipo devuelto por los cuadros de diálogos
basados en Microsoft.Win32
- El evento para saber si se minimiza la ventana
- El evento cuando se mueve el formulario
- Asegurarnos de que un elemento de un ListView sea visible
- Quitar la selección a los elementos
seleccionados de un ListView
- Para poner una ventana encima del resto
- Los valores de Left, Top, Height y Width son Double en lugar de Integer
- AddressOf no "encaja" bien en todos los eventos enrutados
- Consejo de inicialización de la ventana principal
- Sobre cómo cambiar el estado de visibilidad
- Acceder a un control desde un evento de un timer
Recuerda que en Equivalencias
entre las clases de WPF y las de .NET (1) tienes más equivalencias.
Espero que te sea de utilidad.
Nos vemos.
Guillermo