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…
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
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)
Sin embargo, poniendo el DoEvents, se va mostrando el progreso de copia. Y de eso se trata… que se vea lo que está haciendo
Pues… ¡ya está! esto es todo…
Nos vemos.
Guillermo
Hace años estuve en esa situación y use la misma técnica y lo llame DoEvents().
Por lo urgente que tenia que resolver fue lo mas rapido… y lo menos apropiado.
Luego con mas calma use metodos asÃncronos y esa lo que te puedo recomendar.
El problema esa que arrastramos VB6 en la mente y subconciente. Ahora solo uso C# y ya no veo para nada el VB.net hace como 8 años.
Aclaro: Aunque el VB.Net es muy potente y el compilador es igual. prefiero usar C#. Cosa de gustos.
Jajajaja,,, sà lo de DoEvents lo arrastramos desde la época pre-NET y ya en esa época no lo solÃamos recomendar… pero bueno… Yo normalmente usaba otros hilos para esas cosas, pero… a veces hay que simplificar, sobre todo si sé que donde se está usando no provocará problemas 😉
Gracias.