Как преобразовать миллисекунды для отображения мм: сс в 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}}" />

Время может быть свойством в вашем коде позади. Или вы можете связать это с чем-то другим..

Здесь больше примеров.

Другие вопросы по тегам