2009-06-30 5 views
0

J'ai une application Silverlight 2 qui contient un message «Loading Data ...» contenant une animation. Lorsque le service Web renvoie les données et que les données sont chargées dans une collection observable - l'animation se fige (cela peut durer plusieurs secondes pendant le chargement des données et donner l'impression que quelque chose ne va pas.)Chargement de l'animation Figer lors du retour de l'appel de service Web

La collection observable qui est databound à un contrôle d'éléments dans une vue.

Je suppose que ce qui se passe est lorsque les données sont ajoutées à la collection observable l'arbre visuel est en cours de construction pour le contrôle de la base de données - qui se passe sur le thread UI.

Y at-il de toute façon pour moi d'abaisser la priorité du chargement de données afin que l'animation sur le thread ui puisse continuer - même quand il y a une tonne de travail de données sur le thread UI?

grâce Michael

Répondre

-1

Votre animation ne fonctionne pas parce que votre JS traite les données renvoyées. (Navigateur à un seul thread.)

Solution: votre chargement JS sw doit céder périodiquement au navigateur pour permettre au navigateur de faire une animation.

Voir ma réponse SO Why is jQuery Ajax so slow on IE7? pour plus de détails sur la façon de le faire.

+0

hi Larry, ce n'est pas l'animation de chargement xap (qui est en js) - c'est une animation qui s'exécute dans l'application silverlight qui est C#. merci Michael – MIantosca

0

J'ai utilisé un contrôle de progression avec un état indéterminé, puis je l'ai placé dans un contrôle avec un arrière-plan semi-transparent au-dessus du contrôle des éléments. Je ne l'ai pas vu arrêter d'animer pendant que l'appel de service Web est effectué, les objets de retour sont traités dans un ViewModel et le ItemControl rend le modèle de vue mis à jour.

Je pense que vous pouvez personnaliser le modèle de barre de progression d'une manière relativement simple et ajouter le message Loading Data ... en tant que TextBlock. J'ai aussi un message Chargement ... au-dessus du contrôle Progress.

+0

Notez également: J'ai la visibilité du contrôle de chargement lié à un indicateur dans mon ViewModel. –

+0

l'animation fonctionne très bien en attendant le retour du service Web, mais une fois que c'est le cas et que les données sont chargées dans la collection, elles se fige. Je vais essayer la barre de progression pour voir si son animation se fige. – MIantosca

0

Vous avez raison de dire que le rappel se produit sur le thread de l'interface utilisateur. Pour résoudre votre problème, vous pouvez le rendre asynchrone afin qu'il se produise sur un thread d'arrière-plan, puis créer une nouvelle collection observable et remplacer l'existant dans une opération. Par exemple:

private SynchronizationContext _uiThread = SynchronizationContext.Current; 

public void UpdateUIAsynchronously(ICollection<Data> data) 
{ 
ObservableCollection<Data> temp = new ObservableCollection<Data>(); 
foreach(Data currentData in data) 
{ 
temp.Add(currentData); 
} 

_uiThread.Post(delegate(object o) { myDataGrid.ItemsSource = temp }, null); 
} 

Dans mon développement, je trouve que pour un DataGrid je pouvais clair et ajouter les nouveaux éléments sur le thread d'interface sans perte de performance. Peut-être pourriez-vous refactoriser votre code d'interface utilisateur?

Questions connexes