Maison >développement back-end >C++ >Quel est l'équivalent WPF de Application.DoEvents() ?
Simuler le comportement de Application.DoEvents() dans WPF
Dans le développement WPF, vous devrez peut-être actualiser l'interface et effectuer des tâches asynchrones avant de gérer les événements. La méthode Application.DoEvents()
dans WinForms peut réaliser cette fonctionnalité, mais dans .NET 4 et supérieur, WPF n'a pas cette méthode.
Application.DoEvents()
: il met en pause l'opération en cours, confie le contrôle à la pompe à messages pour gérer les événements du système (tels que les mouvements de la souris, les pressions sur les touches), puis rend le contrôle à l'application. Cela permet à l'application de mettre à jour l'interface et d'effectuer d'autres tâches en arrière-plan avant de gérer l'événement.
Alternative dans WPF : Dispatcher.Invoke()
WPF utilise la méthode Dispatcher.Invoke()
pour obtenir des fonctionnalités similaires. Cette méthode vous permet de transmettre un délégué à Dispatcher
et de l'exécuter de manière asynchrone sur le thread de l'interface utilisateur.
Utilisez Dispatcher.Invoke()
pour simuler Application.DoEvents()
:
Le code suivant montre comment personnaliser la méthode DoEvents()
:
<code class="language-csharp">public static void DoEvents() { Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { })); }</code>
Utilisation :
Appelez cette méthode lorsque vous devez actualiser l'interface ou effectuer une tâche asynchrone, par exemple avant de gérer un événement ou d'effectuer une opération asynchrone. Cela garantira que l'interface WPF est mise à jour tout en continuant à gérer les événements entrants.
Par exemple, dans l'exemple de code, appeler myButton_Click()
dans la méthode DoEvents()
peut résoudre le problème des coordonnées inexactes :
<code class="language-csharp">private void myButton_Click(object sender, RoutedEventArgs e) { DoEvents(); // 添加此行 Console.WriteLine("scale {0}, location: {1}", myScaleTransform.ScaleX, myCanvas.PointToScreen(GetMyByttonLocation())); myScaleTransform.ScaleX = myScaleTransform.ScaleY = myScaleTransform.ScaleX + 1; Console.WriteLine("scale {0}, location: {1}", myScaleTransform.ScaleX, myCanvas.PointToScreen(GetMyByttonLocation())); }</code>
En appelant Click
avant de gérer l'événement DoEvents()
, assurez-vous que l'interface est mise à jour pour obtenir les valeurs de coordonnées correctes. Cela évite les erreurs de calcul de coordonnées dues aux mises à jour retardées de l'interface causées par des opérations asynchrones.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!