更改 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 更新函数或类似的东西,但到目前为止找不到任何相关的东西。
下面是如何绑定 Button
的 Content
属性:
<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");
}
根据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 更新函数或类似的东西,但到目前为止找不到任何相关的东西。
下面是如何绑定 Button
的 Content
属性:
<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");
}