Domanda

Il mio BusyIndicator funziona come previsto quando il DomainDataSource recupera i dati. Ma il controllo rimane invisibile quando ho impostato IsBusy true nel codice.

Sto utilizzando Silverlight 4 e il BusyIndicator toolkit. In XAML ho legato la proprietà BusyIndicator.IsBusy alla proprietà IsBusy del mio controllo DomainDataSource. Il controllo BusyIndicator avvolge il mio principale griglia (LayoutRoot) e tutti i controlli figlio.

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

</Grid>
</toolkit:BusyIndicator>

Il problema è che il BusyIndicator non mostra quando ho impostato busyIndicator1 = true; in un pulsante clicca evento. Qualsiasi idea di cosa sto facendo male?

È stato utile?

Soluzione

L'interfaccia utente si aggiorna molto naturalmente sul thread dell'interfaccia utente. Eventi per le cose come i clic sui pulsanti funzionano anche sul thread dell'interfaccia utente.

In alcuni casi cambiamenti di proprietà e chiamate di metodo in controlli si tradurrà in un metodo essere inviato al thread UI. Ciò significa che il metodo da richiamare non effettivamente verificarsi finché il thread UI diventa disponibile per eseguirlo (e quant'altro già in coda è stato eseguito). IsBusy rientra in questa categoria.

Solo quando il codice ha finito con il thread dell'interfaccia utente avrà l'interfaccia utente avere la possibilità di aggiornare il suo appeareance. Non si dovrebbe fare qualsiasi attività lungo in esecuzione in thread dell'interfaccia utente. Nel tuo caso si legare il filo di fare la propria offerta e lasciare l'interfaccia utente affamato di questo filo è possibile utilizzare per ottenere il suo lavoro fatto.

Invece si dovrebbe cercare di utilizzare la classe BackgroundWorker e fare tutto il lavoro pesante nella sua manifestazione DoWork che gira su un thread diverso.

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();
}

Ora questo clic completa l'evento permettendo molto rapidamente il thread dell'interfaccia utente da utilizzare per aggiornare l'interfaccia utente, mentre il lavoro effettivo viene fatto su un thread in background. Una volta completato l'IsBusy viene cancellata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top