Настройка глобального NumberDecimalSeperator / Culture - WPF XAML

У меня действительно, действительно небольшая проблема, которая кажется неприемлемой в WPF. Мне нужен обычай NumberFormatInfoи DateFormatInfoдля моего приложения, и я не хочу использовать StringFormatпараметр в XAML каждый раз, когда я использую число или дату.

Поэтому я попытался глобализовать его глобально следующим образом:

    private void SetCulture()
    {

        var cultureInfo = CultureInfo.CurrentCulture;

        if (!string.IsNullOrEmpty(Settings.Default.LanguageOverride))
            cultureInfo = new CultureInfo(Settings.Default.LanguageOverride);

        cultureInfo.NumberFormat.NumberDecimalDigits = 2;
        cultureInfo.NumberFormat.NumberDecimalSeparator = ",";
        cultureInfo.NumberFormat.NumberGroupSeparator = ".";


        cultureInfo.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
        cultureInfo.DateTimeFormat.FullDateTimePattern = "dd.MM.yyyy";
        cultureInfo.DateTimeFormat.ShortTimePattern = "HH:mm";
        cultureInfo.DateTimeFormat.LongDatePattern = "dd.MM.yyyy";
        cultureInfo.DateTimeFormat.LongTimePattern = "HH:mm";


        SetCulture(cultureInfo);
    }

    private void SetCulture(CultureInfo cultureInfo)
    {
        LocalizeDictionary.Instance.IncludeInvariantCulture = false;

        CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
        CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;

        Thread.CurrentThread.CurrentCulture = cultureInfo;
        Thread.CurrentThread.CurrentUICulture = cultureInfo;

        LocalizeDictionary.Instance.Culture = cultureInfo;

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

Это не работает. DateTimeи Decimalзначения на моем gui не выполняются, независимо от того, что я делаю.

Я получил его для работы, CultureAndRegionInfoBuilderно ему нужны административные привилегии. Я этого не хочу.

Какие-либо предложения? благодаря

c#,wpf,xaml,globalization,

0

Ответов: 1


0 принят

Вы можете установить FrameworkElement.Languageсвойство только на язык , но не на обычай CultureInfo. CultureInfo.CurrentCulture.IetfLanguageTagвозвращает тег языка, на который не влияет NumberFormatили DateTimeFormatсвойства CultureInfo.CurrentCulture.

Что вы можете сделать, примените форматирование по всему миру, чтобы определить пользовательскую привязку, где вы устанавливаете ConverterCultureсвойство в одном месте:

public class CustomBinding : Binding
{
    private static readonly CultureInfo cultureInfo;
    static CustomBinding()
    {
        cultureInfo = new CultureInfo("sv");

        cultureInfo.NumberFormat.NumberDecimalDigits = 2;
        cultureInfo.NumberFormat.NumberDecimalSeparator = ",";
        cultureInfo.NumberFormat.NumberGroupSeparator = ".";

        cultureInfo.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
        cultureInfo.DateTimeFormat.FullDateTimePattern = "dd.MM.yyyy";
        cultureInfo.DateTimeFormat.ShortTimePattern = "HH:mm";
        cultureInfo.DateTimeFormat.LongDatePattern = "dd.MM.yyyy";
        cultureInfo.DateTimeFormat.LongTimePattern = "HH:mm";
    }

    public CustomBinding()
    {
        ConverterCulture = cultureInfo;
    }

    public CustomBinding(string path)
        : base(path)
    {
        ConverterCulture = cultureInfo;
    }
}

Затем вы можете заменить все свои текущие привязки своим пользовательским расширением разметки, например:

<TextBlock Text="{local:CustomBinding Date}" />
C #, WPF, XAML, глобализация,
Похожие вопросы