2010-02-23 5 views
3

J'ai une application wpf qui prend ~ 30 secondes pour créer une carte/graphique. J'ai lu il n'y a pas de moyen facile de lier dans le thread de rendu de l'interface utilisateur pour obtenir une mise à jour de la progression. J'allais donc utiliser un compteur sur un convertisseur de valeur qui colore ma carte mais qui est aussi sur le Thread UI, donc ma question est de savoir si quelqu'un a trouvé des méthodes pratiques pour travailler avec le thread de rendu?WPF UI Thread Status

Merci.

Répondre

3

Vous pouvez créer votre carte/graphique dans un BackgroundWorker qui vous permet d'appeler ReportProgress dans votre fonction, où vous pouvez définir votre pourcentage d'achèvement et augmenter l'événement ProgressChanged pour mettre à jour votre interface utilisateur.

+0

accord sur un autre thread + 1. – Anvaka

+1

Désolé, j'ai oublié de mentionner que je génère ma carte/graphique en XAML en utilisant la liaison. Corrigez-moi si je me trompe, mais dans ce cas, je ne peux pas utiliser un travailleur de fond parce que la carte est rendue dans le fil de rendu caché correct? – Nathan

0

Lorsque vous parlez de thread de rendu de l'interface utilisateur, vous voulez dire que le thread de rendu caché provient de l'interne WPF ou du thread de l'interface utilisateur?

Dans tous les cas, avoir un thread séparé qui construit votre carte et avertit l'interface utilisateur de la progression ne vous aide pas?

0

Je ne sais pas si c'est ce que vous cherchez. J'utilise quelque chose de similaire au code ci-dessous pour charger environ 300 images (environ 200 mb) et ne pas du tout ralentir l'interface utilisateur. (l'utilisateur peut voir chaque image chargée, je garde juste une image de l'espace réservé vide jusqu'à ce que l'image finale soit chargée)

Les images sont chargées dans un fil de fond, puis la fonction est appelée pour les mettre réellement dans la scène WPF.

Voici un exemple simple utilisant une zone de texte. Vous pouvez appeler cette fonction à partir de n'importe quel thread et cela fonctionnera si elle doit changer le thread graphique. (pour mon projet bien sûr, je le fais avec des bitmaps, pas une zone de texte).

delegate void UpdateUIThreadDelegate(String str); 

    public void DisplayString(String strMessage) 
    { 
      if (this.InvokeRequired) 
      { 
       UpdateUIThreadDelegate updateDelegate = DisplayString; 

       this.BeginInvoke(updateDelegate, strMessage); 

       return; 
      } 

      myTextBox.Text = strMessage; 
    } 

Vive Anton

0

Si vous utilisez la liaison pour attacher votre interface utilisateur avec une source de données qui peut prendre beaucoup de temps pour revenir, vous pouvez définir « isAsync = True » sur votre liaison, de sorte que la liaison devient asynchrone .

Si vous souhaitez afficher d'autres données (même une animation que je suppose) pendant le temps de votre source de données est en cours de téléchargement, vous pouvez utiliser un PriorityBinding

HTH

Riana

Questions connexes