【问题标题】:Culture gets reset on button click in WPF app在 WPF 应用程序中单击按钮时会重置文化
【发布时间】:2015-10-23 14:34:33
【问题描述】:

我在一个 WPF 应用程序中看到了奇怪的行为(我在一个示例应用程序中进行了复制,以确保它)。

当应用程序启动时,我将 CultureInfo.CurrentCulture 和 CultureInfo.CurrentUICulture 设置为例如法语,在主应用程序窗口加载之前。然后主应用程序窗口加载并且本地化文本按预期显示为法语,如下所示:

<Window.Resources>
  <Strings x:Key="Resources"/>
</Window.Resources

<Button Content={Binding Label, Source={StaticResource Resources}}/>

问题是,如果我单击按钮,文化和按钮的文本会重置为 en-US。我为 Click 事件添加了一个事件处理程序,其中 CurrentCulture 和 CurrentUICulture 都重置为“en-US”。

知道为什么会这样吗?这似乎很奇怪,这会以某种方式自动发生。

注意:我也试过做

 var cultureName = CultureInfo.CurrentCulture.Name;
 FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),
           new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(cultureName)));

this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag);

在主窗口加载之前,但它没有帮助,文化仍然被重置。

更新:我也在 WPF 论坛 (https://social.msdn.microsoft.com/Forums/vstudio/en-US/884af2cb-fcc3-4cfe-bea0-7a84f74583a8/culture-gets-reset-on-button-click?forum=wpf) 上问过这个问题。在那里,我描述了实际情况可能会更好一些:我需要能够在应用程序启动时设置特定的文化,并在应用程序的整个生命周期中“保留”它。不幸的是,当单击按钮时,文化会被重置,如上所述。

【问题讨论】:

  • 这个问题可能有你需要的答案。看起来好像文化由于某种原因没有应用于控件。但是,不确定您是否可以做很多事情。 stackoverflow.com/questions/4041197/…
  • 有趣的是,如果我在按钮的单击处理程序中设置断点,文化只会在第一次被点击时重置为 en-US。如果单击一次后,我再次设置法语文化,然后再次单击按钮,则 CurrentCulture 和 CurrentUICulture 都是法语。

标签: c# wpf localization cultureinfo


【解决方案1】:

可能与您的 Window.Resources->显示资源字符串的绑定方法有关。我显示这样的本地化字符串:

<Window x:Class="CultureTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:p="clr-namespace:CultureTest.Properties"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Button Content="{x:Static p:Resources.Greeting}"/>
</Grid>

并在 App.OnStartup 中设置文化:

protected override void OnStartup(StartupEventArgs e)
{
    Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ru-RU");
    base.OnStartup(e);
}

它保持了它的文化就好了。这是您的选择吗?

【讨论】:

  • 不幸的是,这不是一个选项,因为我需要能够在运行时动态更改文化(用户从列表中选择它)并且在这种情况下使用 x:Static 扩展不起作用(按钮的内容不会改变)
猜你喜欢
  • 2014-02-10
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多