it-swarm-eu.dev

Text auf einer Fortschrittsleiste in WPF

Dies ist möglicherweise ein Kinderspiel für die WPF-Experten, aber ich würde gerne wissen, ob es eine einfache Möglichkeit gibt, Text auf die WPF-Fortschrittsleiste zu setzen. Für mich sieht eine leere Fortschrittsanzeige nackt aus. Das ist eine Bildschirmfläche, die eine Nachricht über what enthält oder sogar nur Zahlen zur Darstellung hinzufügt. Nun geht es bei WPF nur um Container und Erweiterungen, und ich denke langsam daran, aber da ich keine "Text" - oder "Content" -Eigenschaft sehe, denke ich, ich muss etwas hinzufügen zu dem Container ist das mein Fortschrittsbalken. Gibt es da draußen eine oder zwei Techniken, die natürlicher sind als meine ursprünglichen WinForms-Impulse? Was ist der beste und natürlichste Weg, der Fortschrittsanzeige Text hinzuzufügen?

49
Jacob Proffitt

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 zur Anzeige des Textes verfügt. Sie können die angefügte Eigenschaft TextSearch.Text hijacken, um den Text in eine Fortschrittsleiste zu setzen. 

Wenn es nicht wiederverwendbar sein muss, platzieren Sie einfach den Fortschrittsbalken in einem Grid und fügen Sie dem Grid einen TextBlock hinzu. Da WPF Elemente zusammenstellen kann, funktioniert dies gut.

Wenn Sie möchten, können Sie ein UserControl erstellen, das ProgressBar und TextBlock als öffentliche Eigenschaften verfügbar macht. Es wäre also weniger Arbeit als das Erstellen einer benutzerdefinierten ControlTemplate.

28
Abe Heidebrecht

Beide früheren Antworten (Erstellen einer neuen CustomControl oder einer Adorner) sind bessere Praktiken, aber wenn Sie nur schnell und schmutzig sein möchten (oder visuell verstehen, wie dies geschieht), 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 zuletzt aufgeführte Artikel oben angezeigt wird.

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

55
SmartyP

Dies kann sehr einfach sein (es sei denn, es gibt viele Möglichkeiten, wie das funktioniert).

Sie können Style verwenden, um dies zu erledigen, oder Sie legen einfach eine TextBlock und eine ProgressBar auf. 

Ich persönlich benutze dies, um den Prozentsatz des Fortschritts beim Warten auf die Fertigstellung anzuzeigen.

Um es ganz einfach zu halten, wollte ich nur oneBinding haben, also habe ich den TextBock.Text an den ProgressBar.Value angehängt.

Dann kopiere einfach den Code, um es fertigzustellen.

<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>

So könnte das aussehen:

 enter image description here

Check out WPF Tutorial für den vollständigen Beitrag. 

27
Felix D.

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

Siehe MSDN-Artikel zu Adorners

Sie würden eine Klasse erstellen, die von der Adorner-Klasse erbt. Ü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, die den anzuzeigenden Text enthält. Verwenden Sie dann das Beispiel in dem von mir erwähnten Link, um diesen Adorner zur Adorner-Ebene Ihrer Fortschrittsleiste hinzuzufügen.

5
Bob Wintemberg

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

Setzen Sie dann die TextBlock wie unten gezeigt direkt über dem schließenden Tag von Grid in den von VS generierten Style.

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

Fortschrittsleiste mit Text und Bindung aus 2 Eigenschaften (Wert/Maximalwert):

<Grid>
    <ProgressBar Name="pbUsrLvl"
                 Minimum="1" 
                 Maximum="99" 
                 Value="59" 
                 Margin="5"  
                 Height="24"  Foreground="#FF62FF7F"/>
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBlock.Text>
            <MultiBinding StringFormat="{}UserLvl:{0}/{1}">
                <Binding Path="Value" ElementName="pbUsrLvl" />
                <Binding Path="Maximum" ElementName="pbUsrLvl" />
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>
</Grid>

Rezult:

 enter image description here


Dasselbe aber mit% des Fortschritts:

<Grid>
    <ProgressBar Name="pbLifePassed"
                 Minimum="0" 
                 Value="59" 
                 Maximum="100"
                 Margin="5" Height="24" Foreground="#FF62FF7F"/>
    <TextBlock Text="{Binding ElementName=pbLifePassed, Path=Value, StringFormat={}{0:0}%}" 
           HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>

 enter image description here

0
Andrew