Преобразовать формат короткой даты System.Globalization.DateTimeFormatInfo в Windows.Globalization.DateTimeFormatting.DateTimeFormatter - PullRequest
0 голосов
/ 30 августа 2018

Я использую элемент управления CalendarDatePicker в UWP. Формат даты должен быть локализован в соответствии с выбранной пользователем культурой, которая не обязательно совпадает с настройками языка ОС. Я хочу, чтобы формат даты отображался так же, как и myCultureInfo.DateTimeFormat.ShortDatePattern (например, мм / дд / гггг). CalendarDatePicker предоставляет свойство DateFormat, которое, как ожидается, будет иметь формат, такой как {month.integer} / {day.integer} / {year.full}. Мне нужен конвертер для привязки XAML. Кажется, должен быть простой способ сделать это.

<!-- In XAML -->
<CalendarDatePicker
    FirstDayOfWeek="{x:Bind ViewModel.CalendarFirstDayOfWeek, Mode=OneTime, Converter={StaticResource SystemDayOfWeekToWindowsDayOfWeekConverter}}"
    DateFormat="{x:Bind ViewModel.DateFormat, Mode=OneWay, Converter={StaticResource DateTimeFormatToDateTimeFormatterTemplateConverter}"
    Date="{x:Bind ViewModel.Date, Mode=TwoWay, Converter={StaticResource DateTimeToDateTimeOffsetConverter}}"/>

//Converter
public class DateTimeFormatToDateTimeFormatterTemplateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        //What goes here?
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

Edit: В идеале у CalendarDatePicker должно быть свойство CultureInfo, которое позаботится обо всем этом. Я пробовал свойство Language, но оно не дало заметного эффекта.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Для тех, кто рискует здесь, это как минимум локализует формат даты и первый день недели, но не локализует названия месяцев:

<CalendarDatePicker
    Language="{x:Bind ViewModel.CalendarLanguageCode, Mode=OneWay}"
    FirstDayOfWeek="{x:Bind ViewModel.CalendarFirstDayOfWeek, Mode=OneTime, Converter={StaticResource SystemDayOfWeekToWindowsDayOfWeekConverter}}"
    DateFormat="shortdate"
    Date="{x:Bind ViewModel.Date, Mode=TwoWay}"/>

(Реализация SystemDayOfWeekToWindowsDayOfWeekConverter представляет собой тривиальное преобразование из System.DayOfWeek в Windows.Globalization.DayOfWeek)

0 голосов
/ 03 сентября 2018

Да, вы устанавливаете CalendarDatePicker * DateTimeFormatter , используя CalendarDatePicker * DateFormat Свойство, которое сообщает DateTimeFormatter как отформатировать значение, предоставив строку, которая является либо шаблоном формата, либо шаблоном формата. Свойство Language предназначено для получения или установки информации о языке локализации / глобализации, которая применяется к CalendarDatePicker .

Различный Язык с shortdate DateFormat Свойство может также иметь другой формат даты. Вы можете увидеть разницу с языком en-US и fr-FR .

<StackPanel>
    <CalendarDatePicker Language="en-US" DateFormat="shortdate"/>
    <CalendarDatePicker Language="fr-FR" DateFormat="shortdate"/>
</StackPanel>

Так что, возможно, вам понадобится класс CultureInfo , чтобы получить текущую культуру.

Для преобразования DateFormat вы можете получить все ShortTimePattern из приложения настроек вашего устройства: Настройки => Время и язык => Данные и время => Изменить формат даты и времени, в части Short date вы можете увидеть весь формат. Затем вы можете вернуть соответствующую DateFormat строку в соответствии с ShortTimePattern . Вот пример кода:

var shortDataPattern = CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern;
Debug.WriteLine(shortDataPattern);
        switch (shortDataPattern)
        {
            case "M/d/yyyy":
                // return "shortdate" or the following
                return "{}{month.integer}‎/‎{day.integer}‎/‎{year.full}";
            case "M/d/yy":
                return ...
            ...//Other format
        }
...