【问题标题】:Setting global NumberDecimalSeperator / Culture - WPF XAML设置全局 NumberDecimalSeperator / Culture - WPF XAML
【发布时间】:2018-07-05 11:22:26
【问题描述】:

我有一个在 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 一起工作,但它需要管理权限。这不是我想要的。

有什么建议吗? 谢谢

【问题讨论】:

  • 您只能将 FrameworkElement.Language 属性设置为 语言,而不能设置为自定义 CultureInfoCultureInfo.CurrentCulture.IetfLanguageTag 返回不受NumberFormatDateTimeFormat 属性CultureInfo.CurrentCulture 影响的语言标记。
  • 也就是说我不能全局设置numberformat?
  • 不使用这种方法,但您可以定义自定义绑定。看我的回答。

标签: c# wpf xaml globalization


【解决方案1】:

您只能将FrameworkElement.Language 属性设置为语言,但不能设置为自定义CultureInfoCultureInfo.CurrentCulture.IetfLanguageTag 返回不受CultureInfo.CurrentCultureNumberFormatDateTimeFormat 属性影响的语言标记。

您可以在全局范围内应用格式设置是定义一个自定义绑定,您可以在其中将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}" />

【讨论】:

    猜你喜欢
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2010-12-06
    • 1970-01-01
    • 2014-07-06
    • 2016-04-23
    相关资源
    最近更新 更多