In einem WPF-Benutzersteuerelement muss ich einen Aufruf an einen WebService vornehmen. Ich mache diesen Anruf auf einem separaten Thread, aber ich möchte den Benutzer informieren, dass der Anruf einige Zeit dauern kann.
Die WebMethod gibt mir eine Sammlung von Objekten zurück und ich binde sie an eine ListBox in meinem UC. So weit, so gut ... Dieser Teil funktioniert wirklich gut. Allerdings möchte ich während des Anrufs einen Fortschrittsbalken (oder eine Animation aller Art ...) anzeigen. Diese Animation wäre oben und zentriert im ListBox-Steuerelement.
Ich habe Adorner versucht und es funktioniert teilweise. Allerdings muss ich alle Steuerelemente im geschützten überschreiben void OnRender (DrawingContext drawingContext) ... Ich möchte einfach ein Steuerelement für ein paar Sekunden hinzufügen ...
Hat jemand eine Idee, wie ich das erreichen könnte?
Danke!
Nicht mit dem Adorner gehen - was ich tue, ist zwei separate Container-Steuerelemente (normalerweise Raster), die den gleichen Bereich des Bildschirms belegen. Einer ist meine "Fortschritt" -Kontrolle und der andere ist meine "Inhalts" -Kontrolle. Ich habe die Sichtbarkeit des Fortschrittssteuerelements auf "Eingeschaltet" und die Sichtbarkeit des Inhaltssteuerelements standardmäßig auf "Sichtbar" eingestellt.
Wenn Sie den asynchronen Aufruf für den Webdienst gestartet haben, können Sie die Fortschrittskontrolle sichtbar machen und das Inhaltssteuerelement reduzieren. Wenn der Webservice fertig ist, verwenden Sie Dispatcher.BeginInvoke, um die Benutzeroberfläche zu aktualisieren. Schalten Sie dann die Fortschrittskontrolle wieder auf "Collapsed" und die Inhaltssteuerung auf "sichtbar" zurück.
Generell mache ich die Fortschrittskontrolle unbestimmt. Hier ist ein Beispiel; In diesem habe ich ein separates UserControl namens ProgressGrid, das meine Fortschrittsleiste hat.
%Vor%Und im Code dahinter, einfach so einfach:
%Vor%Es gibt einen Trick, den Sie mit einem Canvas mit Nullhöhe verwenden können, das möglicherweise funktioniert. Chris Andersons WPF-Buch geht ausführlich darauf ein und warum es funktioniert, aber es geht so.
Wenn Sie den Fortschrittsbalken anzeigen möchten, fügen Sie ihn dem Nullhöhe-Canvas hinzu. Es ermöglicht Ihnen, es über das Benutzersteuerelement zu positionieren. Mit Canvas können Sie über seine Grenzen hinausgehen. Das Zentrieren der Fortschrittsleiste sollte nur die Dimensionen des Benutzersteuerelements anzeigen und die Position des Fortschrittsbalkens in dem Canvas entsprechend festlegen. Entfernen Sie den Fortschrittsbalken aus der Zeichenfläche, wenn Sie fertig sind.
Hier ist ein einfaches Beispiel, das eine TextBox verwendet. Es ist nicht perfekt, aber es zeigt die Idee. Wenn Sie auf die Schaltfläche klicken, wird die TextBox oben auf dem InkCanvas
angezeigt %Vor%Tags und Links wpf .net progress-bar .net-3.5 adorner