So zeigen Sie eine Fortschrittsleiste über einem Steuerelement in WPF an

8

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!

    
Martin 01.12.2008, 00:26
quelle

2 Antworten

9

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%     
Rob Ringham 01.12.2008, 00:59
quelle
1

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.

  • Erstellen Sie ein StackPanel
  • fügen Sie einen Canvas mit Height="0" und einem hohen z-index zum Stackpanel hinzu
  • Fügen Sie Ihr Benutzersteuerelement zum Stack-Panel hinzu.

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%     
Mike Two 01.12.2008 00:59
quelle