Подтвердить что ты не робот

Текст в ProgressBar в WPF

Это может быть непростым для WPF cognoscenti, но я хотел бы знать, есть ли простой способ поместить текст в WPF ProgressBar. Для меня пустой индикатор прогресса выглядит обнаженным. Это экранная недвижимость, которая может нести сообщение о , что, или даже просто добавить числа в представление. Теперь WPF касается контейнеров и расширений, и я медленно обдумываю это, но поскольку я не вижу свойства "Текст" или "Контент", я думаю, что мне придется добавить что-то к контейнеру, который является моим индикатором выполнения. Есть ли там техника или две, более естественные, чем мои первоначальные импульсы WinForms? Какой лучший, самый WPF-естественный способ добавить текст в этот индикатор выполнения?

4b9b3361

Ответ 1

Если вам нужно использовать метод повторного использования для добавления текста, вы можете создать новый Style/ControlTemplate, который имеет дополнительный TextBlock для отображения текста. Вы можете захватить прикрепленное свойство TextSearch.Text, чтобы установить текст на индикатор выполнения.

Если ему не нужно многократно использовать, просто поместите индикатор выполнения в сетку и добавьте TextBlock в сетку. Поскольку WPF может составлять элементы вместе, это будет работать хорошо.

Если вы хотите, вы можете создать UserControl, который предоставляет ProgressBar и TextBlock как общедоступные свойства, поэтому это будет меньше работы, чем создание пользовательского элемента ControlTemplate.

Ответ 2

Оба предыдущих ответа (создание нового CustomControl или Adorner) - это лучшие практики, но если вы просто хотите быстро и грязно (или понимать визуально, как это сделать), тогда этот код будет работать:

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

Просто имейте в виду, что z-индекс таков, что последний элемент, указанный выше, будет сверху.

Кроме того, если у вас еще нет Kaxaml, обязательно заберите его - это отлично подходит для игры с XAML, когда вы пытаетесь понять вещи.

Ответ 3

Это может быть очень просто (если есть множество способов заставить это работать).

Вы можете использовать Style чтобы сделать это, или просто наложить TextBlock и ProgressBar.

Я лично использую это, чтобы показать процент прогресса при ожидании завершения.

Для того, чтобы держать его очень просто, я только хотел, чтобы один Binding только, так что я приложил TextBock.Text к ProgressBar.Value.

Затем просто скопируйте код, чтобы сделать это.

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

Вот как это может выглядеть:

enter image description here

Проверьте WPF Tutorial для полного поста.

Ответ 4

Вы можете использовать Adorner для отображения текста поверх него.

См. статья MSDN об Adorners

Вы должны создать класс, который наследуется от класса Adorner. Переопределите метод OnRender, чтобы нарисовать текст, который вы хотите. Если вы хотите, вы можете создать свойство зависимостей для своего пользовательского Adorner, который содержит текст, который вы хотите отобразить. Затем используйте пример в ссылке, о которой я упоминал, чтобы добавить этого Adorner к вашему слою adorner уровня выполнения.

Ответ 5

Щелкните правой кнопкой мыши ProgressBar и выберите "Редактировать шаблон" > "Редактировать копию".

Затем поместите TextBlock, как показано ниже, непосредственно над закрывающим тегом Grid в стиле, сгенерированном VS.

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

Ответ 6

ProgressBar с текстом и привязкой из 2-х свойств (значение/максимальное значение):

<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


То же самое, но с% прогресса:

<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