Question

Mon BusyIndicator fonctionne comme prévu lorsque le DomainDataSource va chercher des données. Mais le contrôle reste invisible quand je mis IsBusy à true dans le code.

J'utilise Silverlight 4 et la boîte à outils BusyIndicator. En XAML je lié la propriété BusyIndicator.IsBusy à la propriété IsBusy de mon contrôle DomainDataSource. Le contrôle enveloppe de BusyIndicator ma principale grille (LayoutRoot) et tous les contrôles enfants.

<toolkit:BusyIndicator IsBusy="{Binding ElementName=labSampleDomainDataSource, Path=IsBusy}"  Name="busyIndicator1">
<Grid x:Name="LayoutRoot">

</Grid>
</toolkit:BusyIndicator>

Le problème est que le BusyIndicator ne montre pas quand je mets busyIndicator1 = true; dans un cliquez sur le bouton événement. Toute idée de ce que je fais mal?

Était-ce utile?

La solution

L'interface utilisateur se met à jour tout naturellement sur l'interface utilisateur de cette discussion. Événements pour des choses comme les clics de bouton également exécuter sur le thread d'interface utilisateur.

Dans certains cas, la propriété des changements et des appels de méthode dans les contrôles se traduira par une méthode être envoyé sur le thread d'interface utilisateur. Ce que cela signifie est que la méthode à invoquer ne se produira pas en fait jusqu'à ce que le thread d'interface utilisateur devient disponible pour l'exécuter (et toute autre chose déjà mis en attente jusqu'à a été exécuté). IsBusy tombe dans cette catégorie.

uniquement lorsque votre code a terminé avec le thread d'interface utilisateur sera l'interface utilisateur la chance de mettre à jour son appeareance. Vous ne devriez pas faire des tâches en cours d'exécution à long dans le thread d'interface utilisateur. Dans votre cas, vous attachez le fil à faire vos propres appels d'offres et laissez l'interface utilisateur affamée de celui-fil, il peut utiliser pour obtenir son travail.

Au lieu de cela, vous devriez chercher à utiliser la classe BackgroundWorker et faire tout le travail lourd dans son événement DoWork qui fonctionne sur un thread différent.

myButton_Click(object sender, RoutedEventArgs e)
{
    isbusyindicator1.IsBusy = true;
    var bw = new BackgroundWorker();
    bw.DoWork += (s, args) =>
    {
       //Stuff that takes some time
    };
    bw.RunWorkerCompleted += (s, args) =>
    {
         isbusyindicator1.IsBusy = false;
    };
    bw.RunWorkerAsync();
}

Maintenant, cet événement, cliquez permettant finalise très rapidement le thread d'interface à utiliser pour mettre à jour l'interface utilisateur alors que le travail réel est effectué sur un fil d'arrière-plan. Lorsque vous avez terminé la IsBusy est effacé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top