Frage

Mein geschäftiger Indikator arbeitet wie erwartet, wenn die DomaindataSource Daten abruft. Aber die Kontrolle bleibt unsichtbar, wenn ich ISBUSY in Code auf wahr setze.

Ich benutze Silverlight 4 und den Toolkit Toward Indicator. In XAML habe ich den geschäftigen Indicator.isbusy -Eigentum an das Isbusy -Eigentum meiner DomaindataSource -Kontrolle gebunden. Die Steuerung des belebten Indizators wickelt mein Hauptnetz (Layoutroot) und alle Kindersteuerungen.

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

</Grid>
</toolkit:BusyIndicator>

Das Problem ist, dass der geschäftige Indikator nicht zeigt, wenn ich geschäftige Indicator1 = true festlegt. Klicken Sie in einer Schaltfläche Klicken Sie auf Ereignis. Irgendeine Idee, was ich falsch mache?

War es hilfreich?

Lösung

Die Benutzeroberfläche aktualisiert sich ganz natürlich auf dem UI -Thread. Ereignisse für Dinge wie Schaltfläche Klicks werden auch im UI -Thread ausgeführt.

In einigen Fällen führt Eigenschaften und Methodenanrufe in Steuerelemente zu einer Methode, die in den UI -Thread versandt wird. Dies bedeutet, dass die aufgerufene Methode nicht tatsächlich auftritt, wenn der UI -Thread verfügbar ist, um sie auszuführen (und alles andere bereits in der Warteschlange wurde ausgeführt). IsBusy fällt in diese Kategorie.

Erst wenn Ihr Code mit dem UI -Thread fertig ist, erhalten Sie die Benutzeroberfläche, um seine Erschichtung zu aktualisieren. Sie sollten im UI -Thread keine langjährigen Aufgaben ausführen. In Ihrem Fall binden Sie den Thread zusammen, um Ihr eigenes Gebot abzugeben, und lassen die Benutzeroberfläche dieses einen Threads ausgehungert, den er verwenden kann, um seine Arbeit zu erledigen.

Stattdessen sollten Sie versuchen, die zu verwenden BackgroundWorker Klasse und all die schwere Arbeit in seiner DoWork Ereignis, das auf einem anderen Thread ausgeführt wird.

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

Jetzt wird dieses Klick -Ereignis sehr schnell abgeschlossen, sodass der UI -Thread die Benutzeroberfläche aktualisiert, während die tatsächlichen Arbeiten in einem Hintergrund -Thread erledigt werden. Nach Abschluss der ISBusy wird gelöscht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top