如何在XAML中格式化TimeSpan
我想格式化绑定到TimeSpan
属性的文本块。 如果该属性是DateTime
types,但是如果它是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}"