我想在我的应用程序的主页面中显示法语格式的日期: (日/月/年) 我使用Entity Framework对象,日期是实体列表的属性,该列表绑定到xaml文件中的组合框。
我设法通过在我的应用启动时添加此代码来解决这个问题:
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
但是我在这个添加中遇到了一个新问题:我的所有十进制数字都使用逗号而不是在我的应用程序的其他页面中使用点... ma app不再适用于此更改...
那么你能给我一个以全球方式解决问题的解决方案...... 总结一下,我需要法国日期格式和带点的小数。 我宁愿不必为我的代码的每一行改变文化。
我已经尝试在相关页面中添加此行,但它没有工作。
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
由于
答案 0 :(得分:3)
如果您只想更改单个控件中日期的格式,那么更改应用程序范围的区域设置不的方式。在ItemTemplate
上设置自定义ComboBox
,并将StringFormat
上的Binding
设置为'dd/MM/yyyy'
。
如果确实需要更改整个应用程序的日期格式,但是您希望保持其他格式不变,则可以在启动时根据当前应用程序应用自定义区域设置,但是获取它在WPF中正常工作需要一些讨厌的反思。
var currentCulture = CultureInfo.CurrentCulture;
if (currentCulture.IsReadOnly)
currentCulture = new CultureInfo(currentCulture.IetfLanguageTag, true);
currentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
// ...adjust other patterns accordingly...
// WARNING: Ugly reflection hacking ahead...
var defaultValueField = typeof(PropertyMetadata).GetField(
"_defaultValue",
BindingFlags.NonPublic | BindingFlags.Instance);
var equivalentCultureField = typeof(XmlLanguage).GetField(
"_equivalentCulture",
BindingFlags.NonPublic | BindingFlags.Instance);
if (defaultValueField != null &&
equivalentCultureField != null)
{
var xmlLanguage = XmlLanguage.GetLanguage(currentCulture.IetfLanguageTag);
equivalentCultureField.SetValue(
xmlLanguage,
currentCulture);
defaultValueField.SetValue(
FrameworkElement.LanguageProperty.DefaultMetadata,
xmlLanguage);
}
Thread.CurrentThread.CurrentCulture = currentCulture;
Thread.CurrentThread.CurrentUICulture = currentCulture;
请确保尽可能早在启动过程中从主线程执行此操作。但请注意,此 会影响整个程序而不仅仅影响WPF可视位。例如,它可能会影响日志中的时间戳格式等。
就个人而言,作为在具有多种语言环境的公司工作的人,我发现简单地对所有日期使用ISO标准yyyy-MM-dd
格式更加困惑。 d/MM/yyyy
和MM/d/yyyy
格式需要消失。
答案 1 :(得分:0)
一种解决方案是根据区域使用具有相同键和值的不同资源文件,并使用culture来加载相应的区域值