WPF 文化问题

Posted

技术标签:

【中文标题】WPF 文化问题【英文标题】:WPF Culture issue 【发布时间】:2014-08-22 14:12:32 【问题描述】:

我想在我的应用程序的主页上以法语格式显示日期: (日/月/年) 我使用实体框架对象,日期是绑定到 xaml 文件中的组合框的实体列表的属性。

我设法通过在我的应用启动时添加此代码来解决这个问题:

FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

但是我遇到了这个添加的新问题:我所有的十进制数字都使用逗号而不是在我的应用程序的其他页面中使用点...ma 应用程序不再适用此更改...

那么您能否给我一个以全球方式解决问题的解决方案... 总结一下,我需要法语日期格式和带点的十进制。 我宁愿不必更改每一行代码的文化。

我已经尝试在相关页面中添加此行,但没有成功。

 Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;

谢谢

【问题讨论】:

【参考方案1】:

如果您只想在单个控件中更改日期格式,那么更改应用程序范围的语言环境不是方法。在ComboBox 上设置自定义ItemTemplate,并将Binding 上的StringFormat 设置为'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/yyyyMM/d/yyyy 格式需要消失。

【讨论】:

我已经尝试添加 stringFormat 但它没有用,并且给我的解决方案是添加代码:FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),新的 FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));我再也找不到我读过这篇文章的地方了,但是在我添加了绑定和我的控件上的 stringFormat 行之后...... 是的,该代码将更改 WPF 元素的默认显示区域性。我上面的代码进行了类似的更改,但我更进一步将 XmlLanguage 重定向到自定义文化。【参考方案2】:

一种解决方案是根据区域让不同的资源文件具有相同的键和值,并使用文化加载各自的区域值

【讨论】:

以上是关于WPF 文化问题的主要内容,如果未能解决你的问题,请参考以下文章

在 .net 5 WPF 应用程序中设置文化

在 WPF、C# 中使用文化访问资源文件

更改文化时wpf更新验证错误

在 RichTextBox WPF 中设置文化/语言

在 WPF .net core 5 中运行时更改应用程序文化时如何更新属性绑定

C# WPF 在构建时创建了太多的文化文件夹