Publié jeudi 29 mai 2008 23:53 par Audrey

[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

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 :

Classé sous ,

# re: [WPF] Application.DoEvents() @ mardi 3 juin 2008 17:41

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 ?

XRMiMil

# re: [WPF] Application.DoEvents() @ mardi 3 juin 2008 22:42

@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 :)

Audrey


Les 10 derniers blogs postés

- [SharePoint] Les sessions TechDays 2012… par Le blog de Patrick [MVP SharePoint] le il y a 3 heures et 45 minutes

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le 02-09-2012, 11:01

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le 02-09-2012, 08:28

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59