el Guille, la Web del Visual Basic, C#, .NET y más...

Equivalencias entre las clases de WPF y las de .NET (2)

 
Publicado el 21/Ago/2007
Actualizado el 21/Ago/2007
Autor: Guillermo 'guille' Som

WinFX .NET 3.0: Equivalencias entre las clases de WPF y las de .NET (segunda parte). Algunas cosas que debes tener en cuenta si quieres usar código de .NET 2.0 en aplicaciones WinFX (.NET 3.0). Pulsa aquí para ver la primera parte.



 

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)

 

13- El tipo de IsChecked es Boolean? (Nullable(Of Boolean))

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.

 

14-El tipo devuelto por los cuadros de diálogos basados en Microsoft.Win32

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.

 

15- El evento para saber si se minimiza la ventana

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.

 

16- El evento cuando se mueve el formulario

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.

 

17- Asegurarnos de que un elemento de un ListView sea visible

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.

 

18- Quitar la selección a los elementos seleccionados de un ListView

En el ListView de Windows.Forms no se si existe esto... pero en el control ListView de WPF puedes usar SelectedItems.Clear().

 

19- Para poner una ventana encima del resto

En WPF tendrás que usar Me.Topmost = True en lugar de Me.BringToFront()

 

20- Los valores de Left, Top, Height y Width son Double en lugar de Integer

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.

 

21-AddressOf no "encaja" bien en todos los eventos enrutados

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).

 

22- Consejo de inicialización de la ventana principal

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.

 

23- Sobre cómo cambiar el estado de visibilidad

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...

 

24- Acceder a un control desde un evento de un timer

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:

  1. El tipo de IsChecked es Boolean? (Nullable(Of Boolean))
  2. El tipo devuelto por los cuadros de diálogos basados en Microsoft.Win32
  3. El evento para saber si se minimiza la ventana
  4. El evento cuando se mueve el formulario
  5. Asegurarnos de que un elemento de un ListView sea visible
  6. Quitar la selección a los elementos seleccionados de un ListView
  7. Para poner una ventana encima del resto
  8. Los valores de Left, Top, Height y Width son Double en lugar de Integer
  9. AddressOf no "encaja" bien en todos los eventos enrutados
  10. Consejo de inicialización de la ventana principal
  11. Sobre cómo cambiar el estado de visibilidad
  12. 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

 


 

Código de ejemplo (comprimido):

No hay código de ejemplo por separado... todo está en el artículo



La fecha/hora en el servidor es: 22/12/2024 18:37:47

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024