2010-02-09 3 views
5

Je dois créer un formulaire dans un thread différent et le maintenir en cours jusqu'à ce qu'un utilisateur fasse une action dans le thread principal (cliquez sur un bouton).wpf méthode pour démarrer la boucle de message d'application

Il est pas très difficile à faire en utilisant

System.Windows.Forms.Application.Run(new ApplicationContext()); 

qui démarre une boucle de message d'application dans le thread en cours. Mais cette solution nécessite l'utilisation de l'espace de noms System.Windows.Forms, qui n'est pas un espace de noms wpf.

Connaissez-vous un wpf-moyen d'atteindre cet objectif? =)

P.S. sans démarrer une boucle de message d'application, le thread sera immédiatement terminé après le traitement de la dernière expression. Ainsi, le formulaire n'apparaîtra que pour un moment et sera fermé. ? = (

Répondre

4

utilisation System.Windows.Threading.Dispatcher.Run()

-1

cette aide

Application.DoEvents in WPF Revisited

extrait de code du blog:

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

namespace Sheva.Windows 
{ 
    /// <summary> 
    /// Designates a Windows Presentation Foundation application with added functionalities. 
    /// </summary> 
    public class WpfApplication : Application 
    { 
     /// <summary> 
     /// Processes all messages currently in the message queue. 
     /// </summary> 
     /// <remarks> 
     /// This method can potentially cause code re-entrancy problem, so use it with great care. 
     /// </remarks> 
     public static void DoEvents() 
     { 
      Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { })); 
     } 
    } 
} 
+0

Non, ce n'est pas = ( – user101375

4

Et, il y a aussi Dispatcher.PushFrame

Ceci est pratique car e il vous permet d'exécuter le messageloop jusqu'à un critère d'arrêt que vous définissez, par exemple pendant qu'une boîte de dialogue de progression est à l'écran.

+0

Méthode très intéressante Avez-vous un exemple de l'utiliser? – user101375

+0

Je n'ai rien de maniable, je l'ai utilisé à mon ancienne société. Je pense que j'ai généralement créé le DispatcherFrame, Ensuite, créez la fenêtre de dialogue, donnez-lui une référence à l'objet DispatcherFrame, puis appelez PushFrame.Lorsque le traitement est terminé ou que l'utilisateur annule, vous définissez la propriété Continue du DispatcherFrame sur false. thread d'arrière-plan à annuler, et attendez qu'il signale le thread de l'interface utilisateur qu'il est en effet annulé, et continuez = false sur cet événement –

+0

'Dispatcher.Run' appelle simplement' Dispatcher.PushFrame (new DispatcherFrame()); '. Donc c'est pareil. – NtFreX

Questions connexes