WPF Культурный вопрос

Я хотел бы отобразить на главной странице моего приложения дату в французском формате: (дд / мм / гггг) я работаю с объектами Entity Framework, а даты - это свойства списка сущностей, который связан с выпадающим списком в файле xaml,

Мне удается пройти через это, добавив этот код при запуске моего приложения:

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

НО я получаю новую проблему с этим дополнением: все мои десятичные числа используют запятую вместо использования точки на других страницах моего приложения... приложение ma больше не работает с этим изменением...

Не могли бы вы дать мне решение, которое решило бы проблему глобально... Подводя итог, мне нужен французский формат даты и десятичное число с точкой. Я бы предпочел не менять культуру для каждой строки моего кода.

Я уже пытался добавить эту строку на соответствующей странице, но это не сработало.

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

Спасибо

2 ответа

Если все, что вы хотите сделать, это изменить форматирование дат в одном элементе управления, то изменение языкового стандарта для всего приложения не является способом сделать это. Установить пользовательский 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 форматы должны уйти.

Одно из решений состоит в том, чтобы иметь разные файлы ресурсов с одинаковыми ключами и значениями в зависимости от региона и использовать культуру для загрузки соответствующего значения региона

Другие вопросы по тегам