0

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

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

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

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

那么,您能否给我一个以全球方式解决问题的解决方案……总而言之,我需要法语日期格式和带点的小数。我宁愿不必更改每一行代码的文化。

我已经尝试在相关页面中添加这一行,但它没有用。

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

谢谢

4

2 回答 2

4

如果您只想在单个控件中更改日期的格式,那么更改应用程序范围的区域设置不是这样做的方法。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 视觉位。例如,它可能会影响日志中的时间戳格式等。

yyyy-MM-dd就个人而言,作为在具有多个语言环境的公司工作的人,我发现简单地对所有日期使用 ISO 标准格式就不会那么混乱了。和d/MM/yyyy格式MM/d/yyyy需要消失。

于 2014-08-22T14:33:21.483 回答
0

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

于 2014-08-22T14:20:17.757 回答