WPF数据绑定如何自定义TimeSpan对象的显示格式
TimeSpan格式化为
10h 12m 55s样式的实现方法 根据场景可以选择以下两种实现方案:
方案1:直接在XAML绑定中配置格式化规则,无需修改后台代码
直接修改TextBlock的绑定代码,加上StringFormat参数即可,适合单次计时不超过24小时的场景:<TextBlock Grid.Column="2" Grid.Row="4" FontSize="20" Text="{Binding Path=ElapsedTime, StringFormat={}{0:h}h {0:m}m {0:s}s}"/>说明:开头的
{}是XAML的转义标记,避免格式字符串开头的花括号被解析器误判为标记扩展。该写法默认不会把TimeSpan的天数折算为小时。方案2:后台新增显示专用属性,适配更灵活的格式需求
如果计时可能超过24小时,需要把天数折算为小时累计显示,或者后续要调整格式逻辑,直接在Streaming类里加一个专门用于显示的字符串属性:public class Streaming { // 原有其他业务代码 private DateTime startTime; public TimeSpan ElapsedTime { get { return DateTime.Now - startTime; } } // 新增格式化后的显示属性 public string ElapsedTimeText { get { // 把天数折算为总小时数,去掉小数部分 int totalHours = (int)ElapsedTime.TotalHours; return $"{totalHours}h {ElapsedTime.Minutes}m {ElapsedTime.Seconds}s"; } } }对应修改XAML的绑定路径为新属性:
<TextBlock Grid.Column="2" Grid.Row="4" FontSize="20" Text="{Binding Path=ElapsedTimeText}"/>
注意事项
当前的ElapsedTime属性没有实现属性变更通知,界面不会自动刷新时长。如果需要实时更新显示,需要做两个改动:
- 让
Streaming类实现INotifyPropertyChanged接口 - 添加一个间隔为1秒的DispatcherTimer,每次Tick时触发对应时长属性的PropertyChanged事件。
内容的提问来源于stack exchange,提问作者Wellwoah
相关产品推荐
相关产品推荐

