【问题标题】:WPF XAML Bindings and CurrentCulture DisplayWPF XAML 绑定和 CurrentCulture 显示
【发布时间】:2021-11-30 21:28:13
【问题描述】:

当 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 中。

任何想法表示赞赏...

【问题讨论】:

    标签: wpf localization


    【解决方案1】:

    事实证明,默认情况下,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);
    

    此博文中提供了更多信息:

    http://www.west-wind.com/weblog/posts/796725.aspx

    【讨论】:

    • 正是我的 Windows Phone 7 应用程序所需要的 - 稍作改动:- this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.Name);
    • 您可以在 App.cs 中为所有绑定执行此操作,如下所述:stackoverflow.com/questions/2764615/…
    • IetfLanguageTag 已弃用。可以改用.Name
    【解决方案2】:

    还值得指出的是,同样的事情发生在 Silverlight 中,除了将 IetfLanguageTag 替换为 Name 之外,使用相同的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 2011-02-28
      相关资源
      最近更新 更多