2010-01-22 5 views
12

J'ai un contrôle utilisateur WPF qui contient un DataGrid. Je lie un ObservableCollection des modèles de vue à lui. Chaque modèle de vue possède une autre collection de modèles de vue que j'utilise pour lier un autre DataGrid à. L'effet est donc DataGrid avec un DataGrid imbriqué contenu dans le modèle de détails de ligne.Comment afficher un graphique ou une animation de chargement lors de la liaison de données wpf

Normalement, la liaison est assez rapide, mais parfois, lorsqu'il y a beaucoup de données, elle peut bloquer l'interface utilisateur pendant la liaison/le dessin.

Existe-t-il un moyen de montrer une animation de chargement ou une barre de progression pendant que la liaison/dessin est en cours?

Répondre

2

Il y a probablement plus formel, ou au moins une solution plus simple, mais vous pouvez utiliser une fenêtre modale qui apparaît dans un thread de travail et est fermé de manière asynchrone lorsque votre est la grille fait chargement:

Window waitWindow = new Window { Height = 100, Width = 200, WindowStartupLocation = WindowStartupLocation.CenterScreen, WindowStyle = WindowStyle.None }; 
waitWindow.Content = new TextBlock { Text = "Please Wait", FontSize = 30, FontWeight = FontWeights.Bold, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; 

BackgroundWorker worker = new BackgroundWorker(); 
worker.DoWork += delegate 
{ 
    Dispatcher.BeginInvoke(new Action(delegate { waitWindow.ShowDialog(); })); 

    DataLoader dataLoader = new DataLoader(); // I made this class up 
    dataLoader.DataLoaded += delegate 
    { 
     Dispatcher.BeginInvoke(new Action(delegate() { waitWindow.Close(); })); 
    }; 

    dataLoader.LoadData(); 
}; 

worker.RunWorkerAsync(); 

Vous peut remplacer le TextBlock par quelque chose qui ressemble à une barre de chargement, et vous pouvez rendre le code réutilisable en paramétrant l'objet qui gère le chargement de la ou des grille (s) et en le passant à une méthode couramment utilisée.

J'espère que cela fonctionne pour vous.

+0

Je mets l'appel à ShowDialog à l'intérieur du délégué DoWork du thread de travail pour traiter le cas où les données sont chargées avant la fenêtre est ouverte (montrant la fenêtre en dehors du travailleur nécessaire à se faire à la fin, depuis les blocs ShowDialog). Je ne sais pas quelle serait la probabilité que cela se produise (même si cela est possible), mais je pensais que je jouerais en toute sécurité plutôt que d'introduire un bug rare et difficile à suivre. –

1

Vous pouvez utiliser un curseur d'attente activé/désactivé à l'aide d'un déclencheur de données. J'ai posté un code here.

2

J'ai eu le même problème et voici comment je l'ai résolu.

J'ai découvert que DataGrid ne commencera à créer des contrôles que lorsqu'il affichera la grille. Dans mon cas, ce processus prenait beaucoup de temps. Après quelques recherches, j'ai trouvé que la création des contrôles se produit pendant la mesure!

Ma solution consiste à remplacer MeasureOverride et à placer le curseur d'attente autour de l'appel de classe de base. J'ai encapsulé mon paramètre de curseur d'attente dans une classe. Donc, le code ressemble à ceci.

protected override Size MeasureOverride(Size availableSize) 
    { 
     using (new DisposableWaitCursor(this)) 
     { 
      return base.MeasureOverride(availableSize); 
     } 
    } 
Questions connexes