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

DoEvents para aplicaciones WPF

 
Publicado el 18/Ene/2019
Actualizado el 18/Ene/2019
Autor: Guillermo 'guille' Som

En las aplicaciones de Windows Presentation Foundation (WPF) no podemos usar el equivalente a DoEvents de Windows Forms, simplemente porque no existe esa funcionalidad para WPF, pero no te preocupes porque aquí te explico cómo crear un método DoEvents listo para usar en las aplicaciones de WPF, por supuesto con el código del VB y C#. (publicado en mi blog)




 

Este contenido está obtenido de mi blog, la URL original es:
DoEvents para aplicaciones WPF

Pues eso… que en las aplicaciones de Windows Presentation Foundation (WPF) no podemos usar el equivalente a DoEvents de Windows Forms, simplemente porque no existe esa funcionalidad para WPF, pero no te preocupes porque aquí te explico cómo crear un método DoEvents listo para usar en las aplicaciones de WPF, por supuesto con el código del VB y C#.

Yo utilizo DoEvents en las ocasiones que quiero refrescar la pantalla (formulario o ventana) de la aplicación, por ejemplo cuando se está haciendo un proceso largo para que no se quede congelada la aplicación.

Y anoche me ocurrió eso mientras ejecutaba una aplicación (de WPF) que me fabriqué para copiar el contenido de una lista de canciones (PlayList tipo m3u) en una carpeta. Y como el disco usado para guardar los MP3 era un disco externo, pues… aparte de que eran muchas canciones (354), pues… parecía que la aplicación fallaba, ya que no mostraba la canción que estaba copiando y… pues eso… que hasta yo pensé que me había equivocado escribiendo el código… Angel

Así que… sabiendo que DoEvents no está definido en WPF y después de probar con que tampoco hay Refresh en los controles de WPF, probé con Thread.Sleep que no solucionó el problema (y no era plan de crear un temporizador), así que… ¡a buscar en Internet!

Y dio resultado la búsqueda, concretamente en esta página:
Implement Application.DoEvents in WPF, ¿el problema? ninguno, salvo que, como suele ocurrir por los interneses, todo está con ejemplos para C#, así que… a convertir el código encontrado.

Este es el código de esa página para simular el DoEvents (en C#):

public static void DoEvents()
    {
        Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background,
                new EmptyDelegate(delegate{}));
    }

En otra parte del código debes tener la definición de EmptyDelegate:

private delegate void EmptyDelegate();

No me sonó demasiado a chino mandarín ya que algo parecido usé hace muuuuuuchos años para llamar a otro control desde el método de evento de un temporizador:
24- Acceder a un control desde un evento de un timer, pero ya ni me acordaba Eye rolling smile

Y esta es la versión para Visual Basic .NET:

' Adaptado de:
' http://www.java2s.com/Tutorial/CSharp/0470__Windows-Presentation-Foundation/
'   ImplementApplicationDoEventsinWPF.htm

Private Delegate Sub EmptyDelegate()

Private Sub DoEvents()
    Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background,
                                        New EmptyDelegate(Sub()
                                                          End Sub))
End Sub

Te tienes que fiar de mi palabra, pero sin el DoEvents, al pulsar en el botón Copiar la aplicación parece como si se hubiese colgado… hasta pasado un buen rato no termina… (Figura 1)

Figura 1. Sin el DoEvents, después de pulsar en Copiar la aplicación se queda congelada
Figura 1. Sin el DoEvents, después de pulsar en Copiar la aplicación se queda congelada

Sin embargo, poniendo el DoEvents, se va mostrando el progreso de copia. Y de eso se trata… que se vea lo que está haciendo Winking smile

Pues… ¡ya está! esto es todo…

Nos vemos.
Guillermo



 


La fecha/hora en el servidor es: 14/11/2024 4:42:41

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024