如何确定 WPF 控件使用的区域设置(区域性)?

Posted

技术标签:

【中文标题】如何确定 WPF 控件使用的区域设置(区域性)?【英文标题】:How to determine the locale (culture) used by a WPF control? 【发布时间】:2014-05-04 11:27:10 【问题描述】:

WPF 控件似乎没有.Cultureproperty,或任何其他明显的控制文本本地化方式的方式。更糟糕的是,在我的测试机器上,它甚至不尊重系统语言环境。我的应用程序需要为德国人工作,因此测试机器运行德语版本的 windows 并且 C# 尊重这一点。因此

String.Format('0', 3.5) == "3,5"

但如果我将本地化留给 WPF,例如通过将数字属性直接绑定到标签或数据网格单元格,我看到了某种美式格式。因此,如果我将3.5 格式化为货币,那么我会在屏幕上看到$3.50

所以:

为什么 WPF 使用错误的语言环境? 如何解决?

理想情况下,“修复”意味着默认情况下使其尊重系统区域设置,同时让我明确控制特定事物。因此,如果我在澳大利亚 PC 上打开一张德国发票,理想的情况是价格看起来像 €3.50

【问题讨论】:

你能提供一些你的绑定代码吗?通常它应该使用CultureInfo.CurrentUICulture。那输出什么? @ZoolWay,显然不是(见 Henk 的回答)。我的CurrentUICultureCurrentCulture 都是德国人。去图吧。 【参考方案1】:

无论系统设置如何,WPF 确实默认为 US。

您可以在 App.Xaml.cs 中进行应用程序范围的设置:

public partial class App : Application

    protected override void OnStartup(StartupEventArgs e)
       
        // Thread settings are separate and optional  
        // affect Parse and ToString:       
        // Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("nl-NL");
        // affect resource loading:
        // Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("nl-NL");

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

        base.OnStartup(e);
    

【讨论】:

在字里行间阅读,我想我也可以在单个元素上设置.Language。尽管在 ViewModel 中将十进制价格显式转换为字符串可能更简洁。 是的,使用 ViewModel,尤其是当格式取决于数据(例如您的发票)时。 UI 链接到用户。

以上是关于如何确定 WPF 控件使用的区域设置(区域性)?的主要内容,如果未能解决你的问题,请参考以下文章

c# winform如何取得一个区域的所有控件对象

Wpf中,怎样获取Canva中指定区域上都有哪些控件?

如何在其可点击区域内居中 WPF 复选框?

嵌套滚动区域

WPF:设置用户控件数据上下文

WPF——UI布局