IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Comment construire des éléments d'interface dans un backgroundworker ?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Points : 69
    Points
    69
    Par défaut Comment construire des éléments d'interface dans un backgroundworker ?
    Salut à tous,

    J'essaie d'utiliser ce joli contrôle pour afficher du texte avec un tooltip différent au dessus de chaque mot: https://wpfbookcontrol.codeplex.com/

    Pour le moment, j'ai un objet usercontrol "MaPage" constitué d'un wrappanel conteneur. Dans mon backgroundworker , je souhaite itérer sur une collection et créer à chaque passe un textblock spécifique qui est ajouté en enfant du wrappanel. Ca me permet d'afficher du texte avec un tooltip par mot.

    le code fonctionne correctement lorsqu'il est exécuté dans le thread de l'UI, mais il y a deux inconvénients majeurs:
    - Il freeze l'interface, ce qui est un peu normal puisque mon itération prend la main sur l'UI.
    - Il charge toute la collection dans "MaPage" vu que l'évènement WrapPanel.SizeChanged n'est pas levé. Or, je pensais utiliser cet évènement pour arrêter l'itération lorsque les textblocks "débordent" du usercontrol "MaPage" en comparant la taille du wrappanel à celle de du usercontrol.

    Pour régler ça, j'ai essayé de mettre mon code dans un backgroundworker mais le problème c'est qu'il refuse de créer des éléments d'interface (le thread appelant doit être en mode STA). Si j'utilise un dispatcher.invoke pour créer le controle (textblock), je ne peux pas y accéder ensuite vu qu'il n'appartient pas au background worker.

    Est-ce que quelqu'un a une solution à proposer pour ce problème? Par ailleurs, quelle méthode me conseilleriez vous pour détecter que le wrappanel est plein?

    Merci!

  2. #2
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Points : 69
    Points
    69
    Par défaut
    de façon assez surprenante, j'ai résolu le problème en faisant mes appels aux contôles comme ça:

    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Dispatcher.Invoke(DispatcherPriority.Background, DirectCast(Sub() wrappanel.Children.Add(New TextBlock With {.Text = " "}), ThreadStart))

    je ne m'attendais pas à ce que l'instance du wrappanel reste accessible entre plusieurs appels. Tant mieux :-) En espérant que ça serve à quelqu'un!

  3. #3
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Points : 69
    Points
    69
    Par défaut
    Une astuce que j'ai trouvé et qui s'avère bien pratique: le background worker a une routine pour fournir la progression de la tâche. Cette routine se déclare comme ça:

    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       Private Sub backgroundWorker1_ProgressChanged(ByVal sender As System.Object, _
        ByVal e As ProgressChangedEventArgs) Handles backgroundworker1.ProgressChanged

    Or ProgressChangedEventArgs se compose de deux éléments:

    - e.ProgressPercentage qui permet d'envoyer à une progressBar la progression
    - e.UserState qui est un objet, utilisable pour sortir n'importe quoi du thread du backgroundworker.

    Or, pour construire de l'interface, il est possible de passer les objets construits dans e.UserState et les ajouter à l'interface dans le thread principal via la sub backgroundWorker1_ProgressChanged.

    En termes de performances, par contre je ne sais pas quelle est la meilleure solution, celle ci ou celle du post précédent. Si quelqu'un sait, je suis preneur. Je mets le sujet en non résolu quelques temps au cas où.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/10/2009, 19h59
  2. [MySQL] Comment afficher des éléments dans une liste déroulante tout en dissimulant un ?
    Par lou87 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/04/2009, 16h45
  3. Réponses: 3
    Dernier message: 25/01/2009, 17h32
  4. Comment organiser des éléments dans un DataList ?
    Par gwenhael dans le forum ASP.NET
    Réponses: 5
    Dernier message: 09/09/2006, 20h30
  5. Réponses: 2
    Dernier message: 16/05/2006, 11h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo