8 votes

Mise à jour de l'interface utilisateur dans les gestionnaires d'événements des éléments WPF

Il y a un problème avec la mise à jour de l'interface utilisateur dans WPF.

J'ai un tel code :

    private void ButtonClick_EventHandler(object sender, RoutedEventArgs e)
    {
        Label.Visibility = Visibility.Visible;
        TextBox.Text = "Processing...";

        LongTimeMethod(); //some long operation
    }

Le problème est que jusqu'à la fin de LongTimeMethod (c'est-à-dire la fin du gestionnaire d'événements), Label.Visibility et TextBox.Text ne seront pas modifiés.

J'ai résolu le problème comme ça jusqu'à présent :

    private void ButtonClick_EventHandler(object sender, RoutedEventArgs e)
    {
        Label.Visibility = Visibility.Visible;
        TextBox.Text = "Processing...";

        Dispatcher.BeginInvoke(new Action(LongTimeMethod), 
            DispatcherPriority.Background);
    }

Existe-t-il une autre solution sans utiliser l'invocation du dispatcher ? L'appel à this.UpdateLayout() n'est d'aucune utilité.

5voto

Steve Greatrex Points 8466

Con Dispatcher.BeginInvoke vous utilisez toujours le thread UI pour LongTimeMethod() . Si cela n'est pas nécessaire (c'est-à-dire s'il s'agit d'un traitement en arrière-plan), je vous suggère d'utiliser le TPL pour l'exécuter sur un thread d'arrière-plan :

private void ButtonClick_EventHandler(object sender, RoutedEventArgs e)
{
    Label.Visibility = Visibility.Visible;
    TextBox.Text = "Processing...";

    Task.Factory.StartNew(() => LongTimeMethod())
        .ContinueWith(t =>
        {
            Dispatcher.BeginInvoke((Action)delegate()
            {
                TextBox.Text = "Done!";
            });
        });

}

Avec cette méthode, la méthode en cours d'exécution est traitée sur un thread d'arrière-plan (ainsi, le thread de l'interface utilisateur sera libre de continuer à effectuer le rendu et l'application ne se bloquera pas) et vous pouvez faire tout ce qui modifie l'interface utilisateur (comme la mise à jour du texte de la zone de texte) sur l'interface utilisateur. Dispatcher lorsque la tâche d'arrière-plan est terminée

1voto

Optillect Team Points 1257

La visibilité et le texte sont des propriétés de dépendance qui sont mises à jour par le répartiteur. Votre solution est tout à fait correcte, mais je vous suggère de le faire de manière asynchrone.

D'autre part, vous pourriez simuler Application.DoEvents dans WPF ( voir l'article ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X