Как преобразовать миллисекунды для отображения мм: сс в XAML?
Я предполагаю, что мне нужно использовать StringFormat для этого, но у меня нет идей, как выяснить формат.
2 ответа
Если ваше входное значение было TimeSpan или DateTime, то вы могли бы использовать строку простого формата. Но я предполагаю, что это не так.
Насколько я знаю, вам нужно реализовать собственный конвертер, который будет принимать ваше значение в качестве аргумента и выводить форматированную строку. Стандартный форматтер C не может выполнять реальные вычисления, такие как модуль, который требуется для вычисления минут.
Пример: (Этот код не проверен, но написан на лету!)
public class MmSsFormatConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Int32 sss = (Int32)value;
Int32 ss = sss / 1000;
Int32 mm = ss / 60;
ss = ss % 60;
return string.Format(@"{0:D2}:{1:D2}", mm, ss);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return Binding.DoNothing; // Thanks to Danny Varod for the suggestion!
}
#endregion
}
Теперь добавьте пространство имен в свой XAML, чтобы распознать конвертер, затем добавьте конвертер как ресурс в свой XAML.
Затем вы можете привязать к конвертеру что-то вроде этого:
<TextBlock Text="{Binding Milliseconds, Converter={StaticResource MmSsFormatConverter}}" />
Обратите внимание, что вам нужно реализовать эту функцию ConvertBack, если вы делаете двустороннее связывание. А также вы можете использовать аргумент paramater для передачи ConverterParameter, например строки формата.
Возможно, вы захотите добавить проверки типов и другие ограничения на код, который я написал. (А как насчет ситуации, когда вы превысите 59:59? Прямо сейчас она перейдет к 60:00, а событие может перейти к 123:59)
Если вы не хотите создавать конвертер, вы также можете сделать:
<TextBox Height="23" Text="{Binding Time, StringFormat={}{0:mm:ss}}" />
Время может быть свойством в вашем коде позади. Или вы можете связать это с чем-то другим..