2008-09-16 13 views
45

Dies ist ein Kinderspiel für die WPF Kenner, aber ich würde gerne wissen, ob es eine einfache Möglichkeit gibt, Text auf die WPF ProgressBar zu setzen. Für mich sieht ein leerer Fortschrittsbalken nackt aus. Das ist Bildschirm Immobilien, die eine Nachricht über was in Bearbeitung ist, oder einfach nur Zahlen zur Darstellung tragen könnte. Jetzt dreht sich bei WPF alles um Container und Erweiterungen und ich denke langsam daran, aber da ich keine "Text" - oder "Content" -Eigenschaft sehe, denke ich, dass ich etwas hinzufügen muss zu dem Container, der mein Fortschrittsbalken ist. Gibt es eine oder zwei Techniken, die natürlicher sind als meine ursprünglichen WinForms-Impulse? Was ist die beste, WPF-natürlichste Art, Text zu diesem Fortschrittsbalken hinzuzufügen?Text auf einer ProgressBar in WPF

+0

Sie können gehen für dieses - [WPF Progress Bar mit dynamischem Text und Textfarbe Update] (http://stackoverflow.com/questions/5167867/wpf-progress-bar-with-dynamic-text-text -color-update) – Rohit

Antwort

27

Wenn Sie eine wiederverwendbare Methode zum Hinzufügen von Text benötigen, können Sie ein neues Style/ControlTemplate erstellen, das über einen zusätzlichen TextBlock verfügt, um den Text anzuzeigen. Sie können die angehängte TextSearch.Text-Eigenschaft übernehmen, um den Text in einer Fortschrittsleiste festzulegen.

Wenn es nicht wiederverwendbar sein muss, legen Sie den Fortschrittsbalken einfach in ein Grid und fügen Sie dem Grid einen TextBlock hinzu. Da WPF Elemente zusammensetzen kann, wird dies gut funktionieren.

Wenn Sie möchten, können Sie ein UserControl erstellen, das die ProgressBar und TextBlock als öffentliche Eigenschaften verfügbar macht, so dass es weniger Arbeit als das Erstellen eines benutzerdefinierten ControlTemplate wäre.

5

Sie könnten einen Adorner verwenden, um Text darüber anzuzeigen.

Siehe MSDN article on Adorners

Sie würden eine Klasse erstellen, die von der Adorner Klasse übernimmt. Überschreiben Sie die OnRender-Methode, um den gewünschten Text zu zeichnen. Wenn Sie möchten, können Sie eine Abhängigkeitseigenschaft für Ihren benutzerdefinierten Adorner erstellen, der den Text enthält, den Sie anzeigen möchten. Verwenden Sie dann das Beispiel in dem Link, den ich erwähnt habe, um diesen Adorner der Adorner-Ebene Ihrer Fortschrittsleiste hinzuzufügen.

50

sind bessere Verfahren Beide der früheren Antworten (eine neue CustomControl oder eine Adorner erstellen), aber wenn man nur schnell und schmutzig wollen (oder visuell zu verstehen, wie es zu tun), dann würde dieser Code funktionieren:

<Grid Width="300" Height="50"> 
    <ProgressBar Value="50" /> 
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"> 
     My Text 
    </TextBlock> 
</Grid> 

Denken Sie daran, dass der Z-Index so ist, dass der letzte Eintrag oben steht.

Auch, wenn Sie noch nicht Kaxaml haben, sollten Sie es abholen - es ist großartig für das Spielen mit XAML, wenn Sie versuchen, die Dinge herauszufinden.

+2

Dies ist der Weg, den ich ursprünglich gegangen bin, aber es sollte beachtet werden, dass auf Systemen mit der auf Windows Classic oder XP eingestellten Benutzeroberfläche der Fortschrittsbalken dunkelblau angezeigt wird, was den Text unlesbar macht. – apc

20

Dies kann sehr einfach sein (es sei denn, es gibt viele Möglichkeiten, dies zu arbeiten).

Sie könnten Style verwenden, um dies zu tun, oder Sie nur eine TextBlock und eine ProgressBar überlagern.

Ich persönlich benutze dies, um den Prozentsatz des Fortschritts zu zeigen, wenn auf den Abschluss gewartet wird.

zu halten, sehr einfach wollte ich nur nur einBinding haben, so angebracht ich die TextBock.Text zum ProgressBar.Value.

                                                                                      Dann kopieren Sie einfach den Code es getan.

<Grid> 
    <ProgressBar Minimum="0" 
       Maximum="100" 
       Value="{Binding InsertBindingHere}" 
       Name="pbStatus" /> 
    <TextBlock Text="{Binding ElementName=pbStatus, Path=Value, StringFormat={}{0:0}%}" 
      HorizontalAlignment="Center" 
      VerticalAlignment="Center" /> 
<Grid/> 

                                                                                                Hier ist, wie dies aussehen könnte:

                                                                      enter image description here

prüfen WPF Tutorial für den vollständigen Beitrag aus.

1

Klicken Sie mit der rechten Maustaste auf ProgressBar und klicken Sie auf Vorlage bearbeiten> Kopie bearbeiten.

Dann setzen Sie die TextBlock wie unten gezeigt direkt über dem schließenden Tag von Grid im Stil von VS generiert.

<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"/> 
    <TextBlock Background="Transparent" Text="work in progress" Foreground="Black" TextAlignment="Center"/> 
</Grid> 
<ControlTemplate.Triggers>