"Beschäftigt" -Effekt-Overlay

8

Ich habe eine wpf-Anwendung, die sehr schwere Aktionen ausführt, bei denen der Benutzer warten muss, während die Anwendung "denkt".

Was ich tun möchte, ist, während der Haupt-Thread der Anwendung denkt, ein anderer Thread deaktiviert das ganze Fenster und gibt ihm eine Art gräuliche Farbe und ein kreisförmiger Fortschrittsbalken erscheint in der Mitte des Bildschirms / p>

Es ist eine Art große Frage und ich brauche nicht den ganzen Code, um das zu tun, nur die allgemeine Idee.

Danke für Ihre Hilfe.

    
Matt Starr 03.01.2012, 10:00
quelle

4 Antworten

12

Zusätzlich zu den obigen Vorschlägen (Hintergrundarbeiter, Dispatcher) - ja, das sind die richtigen Techniken, um zu bekommen, was Sie wollen, aber lassen Sie mich den UI-Effekt besprechen, den Sie in Ihrer Frage angefordert haben. Wenn Sie das MVVM-Muster verwenden, können Sie die Benutzeroberfläche "Ich bin beschäftigt" erstellen und im Ansichtsmodell eine Bindung an eine IsBusy-Eigenschaft herstellen, um die Benutzeroberfläche ein- und auszublenden. Zum Beispiel:

%Vor%

Dann in der Benutzeroberfläche verwenden Sie diese XAML (oder ähnlich)

%Vor%

Wenn Sie einen Hintergrund-Worker oder -Threadpool verwenden, um die DoLongRunningOperation-Funktion in Ihrem Ansichtsmodel aufzurufen, wird der Nettoeffekt angezeigt, wenn der in Xaml definierte Rahmen angezeigt / ausgeblendet wird, wenn der Vorgang gestartet / gestoppt wird. Sie benötigen den Dispatcher auch nicht, um ihn aufzurufen, da WPF das Thread-Marshalling für Sie übernimmt.

Es gibt Implementierungen von ausgelasteten Steuerelementen mit animierten Animationen usw. im Netz, um die Benutzeroberfläche aufzufrischen.

Mit freundlichen Grüßen

    
Dr. ABT 03.01.2012 11:51
quelle
3

Verwenden Sie Dispatcher.BeginInvoke , um die Aktivierung zu ändern. Eigenschaft der UI-Komponenten und Ein- / Ausblenden der Fortschrittsleiste aus dem Worker-Thread

Für den Worker-Thread können Sie die BackgroundWorker-Klasse     

0xDEADBEEF 03.01.2012 10:16
quelle
2

Laden Sie die schwere Aktion in einen neuen Thread und führen Sie die UI-Funktionen (Deaktivieren, Ausgrauen und Fortschrittsbalken) im Hauptthread aus. Siehe BackgroundWorker und Dispatcher .

Es ist möglich, einen neuen Thread für die Benutzeroberfläche zu verwenden, aber nicht das vorhandene Fenster zu verwenden. Ein UI-Steuerelement (Dispatcher) kann online von dem Thread verwendet werden, zu dem es gehört. Sie könnten jedoch einen neuen Thread erstellen und ein neues Fenster mit einem neuen Dispatcher verwenden, um die UI-Funktionen auszuführen. Sie müssten dann das neue Fenster über das Original positionieren. Nicht so einfach wie mein erster Vorschlag. Es kann eine Option sein, wenn Sie nicht wissen, wann die schwere Aktion ausgeführt wird. Siehe hier , hier und hier .

    
Lars Truijens 03.01.2012 10:12
quelle
2

Sehen Sie sich dieses Beispiel an:

%Vor%

Wenn du DoHeavyWork anrufst, gehe ich davon aus, dass wir in dem Thread sind, der Zugriff auf die Benutzeroberfläche hat, was der übliche sein sollte. DisableWindow zeigt die Animation oder was auch immer während der Arbeit angezeigt werden soll. Dann rufen Sie Ihren vordefinierten Delegaten workDelegate auf, der in einem neuen Thread ausgeführt wird. Wenn Sie fertig sind, sollte der Callback die Ansicht wiederherstellen.

Beachten Sie, dass der Aufruf von EnableWindow für den Thread erfolgen muss, der Zugriff auf die Benutzeroberfläche hat.

    
Natxo 03.01.2012 11:41
quelle

Tags und Links