如何在XAML中格式化TimeSpan

时间:2010-12-30 13:47:51

标签: c# wpf xaml data-binding string-formatting

我正在尝试格式化绑定到TimeSpan属性的文本块。如果属性类型为DateTime,则它可以正常工作,但如果它是TimeSpan则失败。我可以使用转换器完成它。但我试图找出是否有其他选择。

示例代码:

public TimeSpan MyTime { get; set; }

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

的Xaml

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

我希望文本块只显示小时和分钟。但它显示为:

  

19:10:46.8048860

10 个答案:

答案 0 :(得分:132)

格式字符串适用于DateTime,而不是TimeSpan

您可以更改代码以使用DateTime.Now。你的xaml很好:

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

<强>更新

.Net 4格式TimeSpan格式如下:

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

答案 1 :(得分:83)

在.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 如果要以1:01输出01:01,请使用StringFormat="{}{0}:{1:00}"

并且Conditional formatting可用于删除分钟的负号。而不是{1:00}我们可以使用{1:00; 00}

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

答案 2 :(得分:37)

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

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

尝试使反斜杠正确:)

答案 3 :(得分:21)

StringFormat必须采用格式字符串的形式。在这种情况下,它看起来像:

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

注意:如果您想显示总小时数和分钟数,且时间跨度恰好超过24小时,那么您的方法有一个警告:Here's a workaround

答案 4 :(得分:14)

对于Multi绑定,您需要注意.NET 4。

下面简要概述,使用.NET 4.6进行测试:

常规绑定:

<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} - &gt; {1:hh \:mm \:ss}”在MultiBinding上工作,这将导致空白结果。

答案 5 :(得分:12)

.NET 4中的WPF现在具有字符串http://msdn.microsoft.com/en-us/library/ee372286.aspx

的时间跨度

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

答案 6 :(得分:10)

我知道这个问题现在已经过时了,但我很惊讶没有人建议这个简单的StringFormat可以直接用于TimeSpan

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

答案 7 :(得分:6)

如果要在使用Content属性的Label中使用StringFormat,可以使用 ContentStringFormat 格式化时间跨度:

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

答案 8 :(得分:3)

TimeSpan StringFormat(以毫秒为单位):

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

答案 9 :(得分:0)

小米解决方案是这样的:

(根据需要多次复制元素 0)

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