it-swarm-eu.dev

Text na ProgressBaru ve WPF

To může být pro WPF cognoscenti nejasné, ale rád bych věděl, jestli existuje jednoduchý způsob, jak dát text na WPF ProgressBar. Prázdný indikátor průběhu vypadá pro mě nahý. To je obrazovka nemovitostí, které by mohly nést zprávu o co je v průběhu, nebo dokonce jen přidat čísla do zastoupení. Nyní, WPF je všechno o kontejnerech a rozšířeních a já jsem se kolem toho pomalu zabalil, ale protože nevidím vlastnost "Text" nebo "Obsah", myslím, že budu muset něco přidat. do kontejneru, který je mým indikátorem průběhu. Je tam nějaká technika nebo dva, které jsou přirozenější než moje původní impulsy WinForms? Jaký je nejlepší, nejvíce přirozený způsob WPF pro přidání textu do tohoto ukazatele průběhu?

49
Jacob Proffitt

Pokud potřebujete přidat opakovaně použitelnou metodu pro přidání textu, můžete vytvořit novou šablonu Style/ControlTemplate, která obsahuje další blok TextBlock pro zobrazení textu. Chcete-li nastavit text na pruhu průběhu, můžete přenést vlastnost TextSearch.Text. 

Pokud to nemusí být opakovaně použitelné, jednoduše umístěte ukazatel průběhu do mřížky a přidejte do mřížky textový blok. Vzhledem k tomu, že WPF může skládat prvky dohromady, bude to fungovat pěkně.

Pokud chcete, můžete vytvořit UserControl, který zpřístupní ProgressBar a TextBlock jako veřejné vlastnosti, takže by bylo méně práce než vytvoření vlastní šablony ControlTemplate.

28
Abe Heidebrecht

Obě předchozí reakce (vytvoření nové proměnné CustomControl nebo Adorner) jsou lepší postupy, ale pokud chcete pouze rychlé a špinavé (nebo vizuálně pochopit, jak to udělat), pak tento kód bude fungovat:

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

Mějte na paměti, že index z je takový, že poslední uvedená položka bude nahoře.

Také, pokud nemáte Kaxaml přesto, ujistěte se, že si to vyzvednout - to je skvělé pro hraní s XAML, když se snažíte zjistit věci.

55
SmartyP

To může být velmi jednoduché (pokud není mnoho způsobů, jak to dostat do práce).

Dalo by se použít Style, aby se to stalo, nebo jen překryli TextBlock a ProgressBar

Osobně to používám k zobrazení procenta pokroku při čekání na dokončení.

Abych to udržel velmi jednoduchý, chtěl jsem mít pouze jedenBinding, , Takže jsem připojil TextBock.Text k ProgressBar.Value.

Pak jen zkopírujte kód, abyste si to udělali.

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

Takto by to mohlo vypadat takto:

 enter image description here

Podívejte se na WPF Tutorial pro plné post. 

27
Felix D.

Pomocí nástroje Adorner můžete zobrazit text nad ním.

Viz Článek MSDN o Adornerech

Vytvořili byste třídu, která zdědí od třídy Adorner. Přepsat metodu OnRender nakreslete požadovaný text. Pokud chcete, můžete vytvořit vlastnost závislost pro vlastní Adorner, který obsahuje text, který chcete zobrazit. Pak použijte příklad v odkazu, který jsem zmínil, a přidejte tento Adorner do vrstvy adorner na panelu průběhu.

5
Bob Wintemberg

Klepněte pravým tlačítkem myši na ProgressBar a klepněte na položku Upravit šablonu> Upravit kopii.

Pak umístěte TextBlock tak, jak je uvedeno níže těsně nad uzavírací značkou Grid ve stylu Generováno VS.

   <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

ProgressBar s textem a vazbou z 2 vlastností (hodnota/maximální hodnota):

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

Výsledek:

 enter image description here


Stejné, ale s% pokroku:

<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