当更改CurrentCulture时,我在XAML文档中看到一些无效行为。当我在窗口中有一些这样的元素时:
<Window x:Class="WpfLocalizationLocBaml.Test"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:glob="clr-namespace:System.Globalization;assembly=mscorlib"
x:Name="wndTest"
Title="Test" Height="300" Width="300">
<StackPanel>
<TextBlock x:Name="lblCultureName"
Text="{Binding Source={x:Static glob:CultureInfo.CurrentCulture},
Path=DisplayName}" />
<TextBlock x:Name="lblLocaleDateValue"
Text="{Binding ElementName=wndTest, Path=TestDate}"/>
<TextBlock x:Name="lblLocaleNumberValue"
Text="{Binding ElementName=wndTest,Path=NumberValue,StringFormat=c}" />
</StackPanel>
</Window>
以及MessageBox.Show(NumberValue.ToString(“c”));当表格开始时,我看到了不同的结果。
如果我使用默认语言运行表单,一切都很明显。但是,如果我在代码中更改文化或在启动时绑定到日期和数字值仍显示en-US格式。显示的MessageBox.Show()值适当地反映了当前的文化。
问题:WPF在绑定方面是否不尊重CurrentCulture?如果是这样,究竟是什么决定了用于绑定的文化。在我的案例中显然是en-US,但不管我在项目中设置的默认语言是什么,它总是在en-US中绑定。
任何想法都赞赏......
答案 0 :(得分:19)
事实证明,WPF在绑定中默认不遵守CurrentCulture,而是默认为XAML文档中定义的xml:Lang设置,如果未提供则默认为en-US。这是相当蹩脚的行为 - 不确定为什么你不会像其他所有UI技术一样应用自动文化格式,但是......
幸运的是,可以在文档的构造函数或Window / UserControl基类中应用一个简单的解决方法:
// MAKE SURE you set the language of the page explicitly or else
// all number and date formatting occurs using
this.Language = XmlLanguage.GetLanguage(
CultureInfo.CurrentCulture.IetfLanguageTag);
此博客文章中提供了更多信息:
答案 1 :(得分:1)
同样值得指出的是,在Silverlight中也会发生同样的事情,除了将IetfLanguageTag替换为Name之外,使用相同的解决方案。