设置全局NumberDecimalSeperator /文化-WPF XAML

时间:2018-07-05 11:22:26

标签: c# wpf xaml globalization

我有一个非常非常小的问题,在WPF中似乎无法解决。 我需要为应用程序自定义NumberFormatInfoDateFormatInfo,并且不想每次使用数字或日期时都使用XAML中的StringFormat选项。

所以我试图像这样在全球范围内对其进行全球化:

    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)));
    }

这不起作用。不管我在做什么,GUI上的DateTimeDecimal值都不会受到影响。

我知道它可以与CultureAndRegionInfoBuilder一起使用,但是它需要管理权限。那不是我想要的。

有什么建议吗? 谢谢

1 个答案:

答案 0 :(得分:0)

您只能将FrameworkElement.Language属性设置为语言,而不能将其设置为自定义CultureInfoCultureInfo.CurrentCulture.IetfLanguageTag返回的语言标签不受NumberFormat的{​​{1}}或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;
    }
}