如何在XAML中格式化TimeSpan

我想格式化绑定到TimeSpan属性的文本块。 如果该属性是DateTimetypes,但是如果它是TimeSpan则失败。 我可以用转换器来完成。 但我试图找出是否有其他的select。

示例代码:

 public TimeSpan MyTime { get; set; } public Window2() { InitializeComponent(); MyTime = DateTime.Now.TimeOfDay; DataContext = this; } 

XAML

 <TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/> 

我期待textblock只显示小时和小点。 但它显示为:

19:10:46.8048860

在.NET 3.5中,您可以使用MultiBinding来代替

 <TextBlock> <TextBlock.Text> <MultiBinding StringFormat="{}{0}:{1}"> <Binding Path="MyTime.Hours"/> <Binding Path="MyTime.Minutes"/> </MultiBinding> </TextBlock.Text> </TextBlock> 

更新
回答评论。

要确保您输出2位数,即使小时或分钟为0-9,您也可以使用{0:00}而不是{0}。 这将确保12:01的输出是12:01而不是12:1。
如果你想输出01:01作为1:01使用StringFormat="{}{0}:{1:00}"

和条件格式可以用来消除分钟的负号。 我们可以使用{1:00; 00}来代替{1:00}

 <TextBlock> <TextBlock.Text> <MultiBinding StringFormat="{}{0:00}:{1:00;00}"> <Binding Path="MyTime.Hours" /> <Binding Path="MyTime.Minutes" /> </MultiBinding> </TextBlock.Text> </TextBlock> 

格式string旨在在DateTime上工作,而不是TimeSpan

你可以改变你的代码来处理DateTime.Now 。 你的xaml很好:

 <TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/> 

更新

从.Net 4格式化一个TimeSpan如下:

 <TextBlock Text="{Binding MyTime,StringFormat=hh\\:mm}"/> 

只是添加到池中,我成功地使用此绑定在生产WPF应用程序中显示TimeSpan:

 Binding="{Binding Time, Mode=TwoWay, StringFormat=\{0:h\\:mm\}}" 

花了一些尝试得到正确的反斜杠:)

StringFormat必须是格式string的forms。 在这种情况下,它看起来像:

 <TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh\\:mm}`}"/> 

注意:如果您想要显示总小时数和分钟数,并且时间跨度大于24小时,则需要注意以下方法: 以下是解决方法 。

.NET 4中的WPF现在具有string时间跨度http://msdn.microsoft.com/zh-cn/library/ee372286.aspx

我正在使用以下<TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />

我知道这个问题现在已经很老了,但是我很惊讶没有人提出这个简单的StringFormat ,它可以直接在TimeSpan上工作:

 <TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/> 

对于多重绑定,您需要注意自.NET 4以来。

下面的一个简短的概述,用.NET 4.6进行testing:

定期绑定:

 <TextBlock Text="{Binding Start, StringFormat='{}{0:hh\\:mm\\:ss}'}" /> 

多重绑定:

 <TextBlock.Text> <MultiBinding StringFormat="{}{0:hh':'mm':'ss} -> {1:hh':'mm':'ss}"> <Binding Path="Start" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" /> <Binding Path="End" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" /> </MultiBinding> </TextBlock.Text> 

或者你可以在多重绑定中使用而不是

 <MultiBinding StringFormat='{}{0:hh":"mm":"ss} -> {1:hh":"mm":"ss}'> 

注意:使用StringFormat =“{} {0:hh \:\:mm \:ss} – > {1:hh \:mm \:ss}”无法在MultiBinding上工作,这将导致空白结果。

如果要在使用Content属性的Label中使用StringFormat,则可以使用ContentStringFormat来设置时间范围的格式:

 <Label Content={Binding MyTimespan}" ContentStringFormat="{}{0:hh}:{0:mm}:{0:ss}"