Как отформатировать TimeSpan в XAML
Я пытаюсь отформатировать текстовый блок, который привязан к 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}"/>
Я ожидаю, что textblock покажет только часы и минты. Но это показывает, как:
19:10:46.8048860
8 ответов:
в .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} мы можем использовать {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>
строка формата предназначена для работы с
DateTime, а неTimeSpan.вы можете изменить свой код для работы с . Ваш xaml в порядке:
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>обновление
и от .Net 4 формат a
TimeSpanследующим образом:<TextBlock Text="{Binding MyTime,StringFormat=hh\:mm}"/>
просто чтобы добавить в пул, я успешно использую эту привязку для отображения TimeSpan в производственном приложении WPF:
Binding="{Binding Time, Mode=TwoWay, StringFormat=\{0:h\:mm\}}"взял несколько попыток, чтобы получить обратную косую черту прямо :)
StringFormatдолжен быть в виде строки формата. В этом случае это будет выглядеть так:<TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh\:mm}`}"/>Примечание: Если вы хотите отобразить общее количество часов и минут, а промежуток времени превышает 24 часа, есть предостережение с вашим подходом:вот решение.
для нескольких Привязок вам нужно обратить внимание с .NET 4.
краткий обзор ниже, протестирован с .NET 4.6:
обычная привязка:
<TextBlock Text="{Binding Start, StringFormat='{}{0:hh\:mm\:ss}'}" />Multi binding:
<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:
<MultiBinding StringFormat='{}{0:hh":"mm":"ss} -> {1:hh":"mm":"ss}'>Примечание.: используя StringFormat= " {} {0:hh\:\: mm\: ss} - > {1:hh\: mm\: ss}" будет не работа над a MultiBinding, это приведет к пустому результату.
WPF в .NET 4 теперь имеет timespan из строк http://msdn.microsoft.com/en-us/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}"/>
Если вы хотите использовать StringFormat в метке, которая использует свойство Content, вы можете использовать ContentStringFormat чтобы отформатировать ваш промежуток времени:
<Label Content={Binding MyTimespan}" ContentStringFormat="{}{0:hh}:{0:mm}:{0:ss}"
Comments