2010-09-09 4 views
2

J'ai une application SL qui lit certaines données de la base de données, ce que je fais à travers un service WCF. J'avais des problèmes de retard en raison de cet accès, alors je l'ai résolu en chargeant toutes les données dans un dictionnaire de mon application. Maintenant, je veux m'assurer que l'application ne sera affichée qu'après avoir chargé toutes ces informations, comment puis-je faire cela? Je pensais que mettre juste mon InitializeComponents après le chargement de données serait suffisant, mais ce n'est pas le cas. Voici une partie de mon code:Comment afficher mon application Silverlight après le chargement des données?

public Brasil() 
{ 
    //InitializeComponent(); 
    webService = new DataRetrieverReference.DataRetrieverClient(); 
    webService.GetCounterCompleted += new EventHandler<WebPortos.DataRetrieverReference.GetCounterCompletedEventArgs>(webService_GetCounterCompleted); 
    webService.GetCounterAsync(); 
    webService.GetDataCompleted += new EventHandler<DataRetrieverReference.GetDataCompletedEventArgs>(webService_GetDataCompleted); 

} 

void webService_GetCounterCompleted(object sender, WebPortos.DataRetrieverReference.GetCounterCompletedEventArgs e) 
{ 
    int counter = e.Result; 
    this.dictionary = new Dictionary<int, WebPortos.DataRetrieverReference.vwPortos_SEP>(); 

    for (int i = 0; i < counter; i++) 
    { 
     webService.GetDataAsync(i); 
    } 

    InitializeComponent(); 
} 

Comme vous pouvez le voir, je l'ai mis dans ma méthode de chargement de données, mais cela n'a pas fonctionné. Des conseils?

Répondre

1

Il est de mauvaise pratique de retarder la création des vues de quelque façon que ce soit. Laissez InitializeComponent dans le constructeur! :)

Ce que vous voulez faire est simplement cacher votre affichage jusqu'à ce que les données sont prêtes. Le moyen le plus simple (pour garder cet exemple simple) est de commencer avec la valeur Visibility pour qu'elle soit réduite sur un élément parent de la page, puis de la redéfinir sur Visible après le chargement des données.

Les solutions du monde réel impliquent l'utilisation d'indicateurs occupés pour arrêter l'interaction avec des zones/contrôles spécifiques pendant le chargement des données.

+0

Le problème est qu'il est destiné à être la solution du monde réel ... Je vais le réparer après la date limite. –

+0

Alors pourquoi ne pas utiliser un indicateur de présence? Placez simplement tout le contenu en un et définissez la propriété IsBusy pour le contrôler. Acclamation –

0

En regardant votre code le GetDataAsync fait une demande de async pour chaque ensemble de données, puis effectuer la InitializeComponent après. Vous devrez donc retarder l'appel InitializeComponent jusqu'à ce que tous les rappels GetDataCompleted aient été renvoyés et que toutes les données aient été récupérées.

Questions connexes