如何确定 WPF 控件使用的区域设置(区域性)?
Posted
技术标签:
【中文标题】如何确定 WPF 控件使用的区域设置(区域性)?【英文标题】:How to determine the locale (culture) used by a WPF control? 【发布时间】:2014-05-04 11:27:10 【问题描述】:WPF 控件似乎没有.Culture
property,或任何其他明显的控制文本本地化方式的方式。更糟糕的是,在我的测试机器上,它甚至不尊重系统语言环境。我的应用程序需要为德国人工作,因此测试机器运行德语版本的 windows 并且 C# 尊重这一点。因此
String.Format('0', 3.5) == "3,5"
但如果我将本地化留给 WPF,例如通过将数字属性直接绑定到标签或数据网格单元格,我看到了某种美式格式。因此,如果我将3.5
格式化为货币,那么我会在屏幕上看到$3.50
。
所以:
为什么 WPF 使用错误的语言环境? 如何解决?理想情况下,“修复”意味着默认情况下使其尊重系统区域设置,同时让我明确控制特定事物。因此,如果我在澳大利亚 PC 上打开一张德国发票,理想的情况是价格看起来像 €3.50
。
【问题讨论】:
你能提供一些你的绑定代码吗?通常它应该使用CultureInfo.CurrentUICulture
。那输出什么?
@ZoolWay,显然不是(见 Henk 的回答)。我的CurrentUICulture
和CurrentCulture
都是德国人。去图吧。
【参考方案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 控件使用的区域设置(区域性)?的主要内容,如果未能解决你的问题,请参考以下文章