题
对于 WPF 行家来说,这可能是理所当然的事情,但我想知道是否有一种简单的方法可以将文本放在 WPF ProgressBar 上。对我来说,一个空的进度条看起来毫无意义。这是可以传达以下信息的屏幕空间 什么 正在进行中,或者甚至只是在表示中添加数字。现在,WPF 都是关于容器和扩展的,我正在慢慢地思考这一点,但由于我没有看到“文本”或“内容”属性,我想我必须添加一些东西到我的进度条容器。有没有一两种技术比我最初的 WinForms 冲动更自然?向进度条添加文本的最佳、最自然的 WPF 方式是什么?
解决方案
如果您需要可重用的方法来添加文本,则可以创建一个新的 Style/ControlTemplate,其中包含一个附加的 TextBlock 来显示文本。您可以劫持 TextSearch.Text 附加属性来设置进度栏上的文本。
如果不需要可重用,只需将进度条放在 Grid 中,然后向网格添加 TextBlock 即可。由于 WPF 可以将元素组合在一起,因此这会很好地工作。
如果需要,您可以创建一个将 ProgressBar 和 TextBlock 公开为公共属性的 UserControl,因此它比创建自定义 ControlTemplate 的工作量要少。
其他提示
之前的两个响应(创建一个新的 CustomControl
或一个 Adorner
)是更好的做法,但如果您只是想要快速而肮脏(或直观地了解如何做到这一点),那么此代码可以工作:
<Grid Width="300" Height="50">
<ProgressBar Value="50" />
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
My Text
</TextBlock>
</Grid>
请记住,z 索引使得列出的最后一项将位于顶部。
另外,如果你没有 卡克萨米尔 不过,请务必选择它 - 当您尝试解决问题时,它非常适合使用 XAML。
这可以很简单 (除非有很多方法让它发挥作用)。
你可以使用 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>
这是这样的:
查看 WPF教程 完整的帖子。
您可以使用装饰器在其上方显示文本。
您将创建一个继承自 Adorner 类的类。重写 OnRender 方法来绘制所需的文本。如果需要,您可以为自定义装饰器创建一个依赖属性,其中包含要显示的文本。然后使用我提到的链接中的示例将此装饰器添加到进度栏的装饰器层。
右键点击 ProgressBar
, ,然后单击编辑模板 > 编辑副本。
然后把 TextBlock
如下所示,位于结束标签上方 Grid
在VS生成的Style中。
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"/>
<TextBlock Background="Transparent" Text="work in progress" Foreground="Black" TextAlignment="Center"/>
</Grid>
<ControlTemplate.Triggers>
带有文本的进度条和来自 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>
结果:
一样但是 进度百分比 :
<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>