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.
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
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
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 .
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.
Tags und Links wpf