2016-12-22 3 views
0

J'ai un projet WPF avec un DataGrid lié à une collection Observable. Cette collection est remplie à l'aide d'une méthode asynchrone. Lorsque j'appelle cette méthode asynchrone, une animation avec un anneau de progression est affichée à l'utilisateur. Pendant que la collection attend les données, tout fonctionne sans délais, mais lorsque le DataGrid se remplit avec les éléments, l'animation de l'anneau de progression cesse de fonctionner pendant 1 seconde ou 2 jusqu'à ce que le DataGrid charge tous les enregistrements (cette collection peut avoir 50 000 enregistrements ou plus). Je me demandais juste s'il existe un moyen de ne pas verrouiller l'animation lorsque le DataGrid se remplit avec les informations retournées par la collection.L'interface utilisateur WPF se fige lors du remplissage de DataGrid

La configuration est: J'ai une fenêtre principale avec un contrôle utilisateur caché qui affiche/cache l'animation en utilisant une propriété nommée IsLoading. Lorsque ce contrôle utilisateur est visible, il verrouille tous les objets utilisateur derrière lui.

Le code est

<Grid> 
<local:LoadingOverlayView 
     DataContext="{Binding Assets}" 
     d:IsHidden ="True" 
     Visibility="{Binding IsLoading, 
     Converter={StaticResource BoolToVisibilityConverter}, 
       UpdateSourceTrigger=PropertyChanged}"/> 
</Grid> 
+1

Avez-vous essayé d'utiliser un autre fil pour votre animation? – Master117

+0

Pouvez-vous donner un exemple de comment faire cela? –

+0

Vous devez utiliser [BackGroundWorker] (https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx), également parcourir cette section [Comment utiliser WPF Background Worker] (http://stackoverflow.com/questions/5483565/how-to-use-wpf-background-worker) –

Répondre

0

La meilleure façon de mettre en œuvre des anneaux de progrès animés, des bars, etc. est d'utiliser un fil secondaire pour eux. Ensuite, pour synchroniser les autres threads avec le thread ui, utilisez la méthode Dispatcher.Invoke().

+0

Dispatcher.Invoke() est une méthode utilisée pour indiquer au Dispatcher d'exécuter de manière synchrone (comme un délégué) quelque chose sur le thread que le Dispatcher associé à. Il n'est pas utilisé pour "_synchroniser d'autres threads avec ui thread_". –

0

Cela signifie que la virtualisation de la grille de données est désactivée. Il crée tout l'élément d'interface utilisateur pour toutes les lignes. Cela peut avoir différentes causes. Très probablement parce que vous mettez le DataGrid dans un scrollpanel. En faisant cela, il ne sait pas quelle est la hauteur et ne peut pas déterminer l'ensemble minimal de lignes qu'il doit créer des éléments d'interface utilisateur.

c'est bonne lecture: https://msdn.microsoft.com/en-us/library/cc716879(v=vs.110).aspx mais il peut devenir assez complexe

+0

Certes, la virtualisation des lignes et des colonnes pourrait aider, mais elle a aussi ses propres limites. Je recommande d'utiliser la virtualisation avec un thread d'arrière-plan, afin de ne pas bloquer le thread d'interface utilisateur, en particulier dans le cas où il y a plusieurs lignes à afficher. –

+0

Je doute vraiment de cela; la question indique clairement: «Pendant que la collection attend les données, tout fonctionne sans délais, mais lorsque le DataGrid se remplit avec les éléments, l'animation de progression s'arrête de fonctionner pendant 1 seconde ou 2 jusqu'à ce que le DataGrid charge tous les enregistrements (Cette collection peut avoir 50 000 enregistrements ou plus). "Donc, les charges sans délai et l'animation de l'anneau de processus s'arrête; indique qu'il n'a pas de retard dans la construction de la collection mais au moment où la grille de données va faire son travail. –

+0

Exactement, c'est quand le DataGrid se peuple que l'animation de l'Anneau de progression bloque une courte période de temps ... Ce n'est pas un gros problème mais il serait préférable que je continue à voir l'animation en anneau sans "étouffer" lui-même pendant que le DataGrid charge les données ... Je ne sais pas non plus comment isoler cela dans 2 threads différents puisqu'il s'agit de 2 UserControls WPF différents liés à une propriété True/False commune qui affiche ou masque l'animation après le chargement de la Datagrid termine ... –