我在UWP中使用CalendarDatePicker控件。日期的格式应本地化为用户选择的区域性,不一定与OS语言设置相同。我希望日期格式与myCultureInfo.DateTimeFormat.ShortDatePattern相同(例如mm / dd / yyyy)。 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();
}
}
编辑: 理想情况下,CalendarDatePicker仅具有一个CultureInfo属性,可以处理所有这些问题。我尝试使用Language属性,但效果不明显。
答案 0 :(得分:1)
是的,您可以使用CalendarDatePicker的DateTimeFormatter属性设置CalendarDatePicker的DateFormat,该属性告诉DateTimeFormatter如何设置值的格式提供一个字符串,该字符串可以是格式模板,也可以是格式模式。 Language属性用于获取或设置适用于CalendarDatePicker的本地化/全球化语言信息。
Language与shortdate
DateFormat属性不同,日期格式也可能不同。您可以使用 zh-CN 和 fr-FR 语言查看不同的内容。
<StackPanel>
<CalendarDatePicker Language="en-US" DateFormat="shortdate"/>
<CalendarDatePicker Language="fr-FR" DateFormat="shortdate"/>
</StackPanel>
因此,您可能需要使用CultureInfo类来获取当前的区域性。
对于DateFormat转换,您可以从设备设置应用中获取所有ShortTimePattern:设置=>时间和语言=>数据和时间=>更改日期和时间格式,以短日期部分,您可以在其中看到所有格式。然后,您可以根据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
}
答案 1 :(得分:0)
对于任何在这里冒险的人,这将至少本地化日期格式和一周中的第一天,但不会本地化月份的名称:
<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的简单转换)