更改 CurrentUICulture 后按钮的内容未更新

Content of button is not updated after changing the CurrentUICulture

根据this tutorial,我尝试在我的 WPF .NET Core 3.1 应用程序中实现多语言系统。如果我直接更改 Window 元素的 属性 Title 一切正常,应用程序从相应的资源文件中读取,该文件是通过更改 CurrentUICulture.[=19 定义的=]

这里是这样一个变化的代码:

private void BtnChangeLanguageToCsCz_Click(object sender, RoutedEventArgs e)
{
    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("cs-CZ");
}

private void BtnChangeLanguageToEnUs_Click(object sender, RoutedEventArgs e)
{
    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
}

但是在我点击这些按钮中的任何一个之后,它们的内容仍然没有更新。我觉得我需要调用一些 UI 更新函数或类似的东西,但到目前为止找不到任何相关的东西。

下面是如何绑定 ButtonContent 属性:

<Button x:Name="BtnInstall" Content="{x:Static p:Resource.ButtonInstall}" HorizontalAlignment="Center" Margin="0,324,0,0" VerticalAlignment="Top" Height="50" Width="200" Click="BtnInstall_Click"/>

资源文件的修饰符设置为 public,名称如下:

我应该怎么做才能让它自动更新?

A 找到了一个基于 this 教程的解决方案,而不是使用线程的文化或 resource.resx 文件,它使用 XAML 资源字典。

这可以根据您的情况进行更改,但是,我为我的 MainWindow.xaml:

  • 我在名为 /Resources.
  • 的文件夹中创建了两个名为 'MainWindow.en-GB.xaml' 和 'MainWindow.cs-CZ.xaml' 的资源词典
  • 然后我将构建操作设置为 Content,将复制到输出目录设置为 Copy if newer
  • 创建资源字典后,我创建了一个名为 Text:
  • 的示例资源
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:sys="clr-namespace:System;assembly=mscorlib">
        <sys:String x:Key="Text">Hello</sys:String>
</ResourceDictionary>
  • 然后在我的MainWindow.xaml中添加了如下代码:
<Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Resources/MainWindow.en-GB.xaml"></ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
  • 接着,将按钮的内容设置为资源Text:
<Button x:Name="BtnInstall" 
    Content="{DynamicResource ResourceKey=Text}" 
    HorizontalAlignment="Center" 
    Margin="0,324,0,0" 
    VerticalAlignment="Top" 
    Height="50" 
    Width="200" 
    Click="BtnInstall_Click" />
  • 最后,通过使用 linked tutorial 中的 LocUtil,调用 LocUtil.SwitchLanguage 方法,我可以在两者之间切换:
private void BtnChangeLanguageToEnUs_Click(object sender, RoutedEventArgs e)
{
    LocUtil.SwitchLanguage(this, "en-US");
}