Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

[WPF] Application.DoEvents()

Pendant que je codais la suite du projet (un premier bout ici) sur lequel je bosse actuellement (et qui fera l'objet d'un prochain post Wink), j'ai voulu utiliser la méthode suivante :

Application.DoEvents()

Or cette méthode n'existe pas dans WPF. Pour palier à cela j'ai effectué quelques recherches sur Internet et voici 2 différentes solutions que j'ai trouvées et ensuite testées, et qui peuvent remplacer cette méthode.

La première consiste à faire référence à System.Windows.Form.dll et à utiliser Application.DoEvents() qui est disponible dans cette assembly.

Le seconde consiste en deux méthodes qui permettent de remplacer la méthode souhaitée (je copie les méthodes pour ceux qui aurait la flemme de cliquer sur le lien, et pour les autres c'est par ici) :

using System;
using System.Windows;
using System.Windows.Threading;

namespace Sheva.Windows
{

/// <summary>
/// Designates a Windows Presentation Foundation application model with added functionalities.
/// </summary>

public class WpfApplication : Application
{
   private static DispatcherOperationCallback exitFrameCallback = new

   DispatcherOperationCallback(ExitFrame);

   /// <summary> 
   /// Processes all UI messages currently in the message queue.
   /// </summary>

   public static void DoEvents()
   {
      // Create new nested message pump.

      DispatcherFrame nestedFrame = new DispatcherFrame();

      // Dispatch a callback to the current message queue, when getting called,
      // this callback will end the nested message loop.
      // note that the priority of this callback should be lower than the that of UI event messages.

      DispatcherOperation exitOperation = Dispatcher.CurrentDispatcher.BeginInvoke(
      DispatcherPriority.Background, exitFrameCallback, nestedFrame);

      // pump the nested message loop, the nested message loop will
      // immediately process the messages left inside the message queue.

      Dispatcher.PushFrame(nestedFrame);

      // If the "exitFrame" callback doesn't get finished, Abort it.

      if (exitOperation.Status != DispatcherOperationStatus.Completed)
      {
         exitOperation.Abort();
      }
   }

   private static Object ExitFrame(Object state)
   {
      DispatcherFrame frame = state as DispatcherFrame;

      // Exit the nested message loop.

      frame.Continue = false;
      return null;
   }

}
}


 

J'aurai tendance à dire que la première méthode est la plus simple à mettre en place et la plus compréhensible pour quelqu'un qui devrait maintenir le code de l'application. La seconde permet de ne pas faire référence à une autre assembly, et de pouvoir modifier au besoin le travail du DoEvents().

Et vous qu'en pensez-vous ? Toutes les suggestions sont les bienvenues ! Smile

Publié jeudi 29 mai 2008 23:53 par Audrey
Classé sous :
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: [WPF] Application.DoEvents()

Pas mal, j'aime bien !!!

Sinon, j'ai trouvé ça il y a quelques mois sur le net :

while (maCondition != true)

{

    // Code equivalent de l'Application.DoEvents()

    Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, new ThreadStart(delegate { }));

}

Pas de plantage, et puis surtout, ça ma bien dépanner. Mais bon, on ne peut pas, au besoin, modifier le travail de ce 'DoEvents()'.

Qu'en pensez-vous ?

mardi 3 juin 2008 17:41 by XRMiMil

# re: [WPF] Application.DoEvents()

@XRMiMil : je viens de tester votre solution et effectivement elle remplace très bien aussi le Application.DoEvents(). Elle pourrait être la version condensée de la version dont j'ai parlé dans mon post :)

mardi 3 juin 2008 22:42 by Audrey
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [WPF] Formatter l’affichage lors d’un binding, via StringFormat par Thomas Lebrun le il y a 42 minutes

- WSC08 : Le bilan, Les Photos, Les Webcasts à voir ou à revoir par Blog de Daniel TIZON [daniel] le il y a 9 heures et 50 minutes

- SharePoint et ses DB : Avez vous pensé à les "Tweaker" ? par The Mit's Blog le il y a 10 heures et 19 minutes

- NTttcp : Mesurer la vitesse d'un réseau par Blog d'Olivier Huet le il y a 10 heures et 43 minutes

- Un nouveau quizz par Matthieu MEZIL le il y a 13 heures et 27 minutes

- Webcast ADO.NET Data Services par Matthieu MEZIL le il y a 13 heures et 30 minutes

- edmx : mise à jour du modèle depuis la base par Matthieu MEZIL le il y a 17 heures et 17 minutes

- Alternatif - Mono 2.0 est arrivé! par #Rui le il y a 18 heures et 31 minutes

- Nouveaux avatars pour vos comptes CodeS-SourceS (suite) par Nix's Blog le il y a 20 heures et 36 minutes

- WSC 2008 : les Videos disponibles ! par Philippe Sentenac [MVP SharePoint] le il y a 22 heures et 44 minutes