我正在使用VS 2015为一个新项目开发WPF测试应用程序,其中用户可以在运行时更改语言。
所以我根据这个article做了我的测试项目。
我将三个RESX文件添加到Proerties-folder中。
然后,我添加了一个构造函数和用于在语言之间切换的方法。
namespace MultipleLanguages
{
/// <summary>
/// Interaktionslogik für "App.xaml"
/// </summary>
public partial class App : Application
{
/// <summary>
/// The constructor.
/// </summary>
public App()
{
// Sets the desired language.
ChangeLanguage("de-DE");
}
/// <summary>
/// Switches to language german.
/// </summary>
public void SwitchToLanguageGerman()
{
ChangeLanguage("de-DE");
}
/// <summary>
/// Switches to language english.
/// </summary>
public void SwitchToLanguageEnglish()
{
ChangeLanguage("en-US");
}
/// <summary>
/// Changes the language according to the given culture.
/// </summary>
/// <param name="culture">The culture.</param>
private void ChangeLanguage(string culture)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
MultipleLanguages.Properties.Resources.Culture = new CultureInfo(culture);
}
}
}
最后,我实现了我的WPF窗口的资源。
首先是XAML:
<Window x:Class="MultipleLanguages.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MultipleLanguages"
xmlns:mlres="clr-namespace:MultipleLanguages.Properties"
mc:Ignorable="d"
Title="{x:Static mlres:Resources.mainwindowtitle}"
Height="350"
Width="525">
<Grid x:Name="grd_mainpanel">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid x:Name="grd_persondatapanel"
Grid.Row="0"
Grid.Column="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Grid.Row="0"
Grid.Column="0"
Content="{x:Static mlres:Resources.firstname}"
Margin="5"></Label>
<Label Grid.Row="1"
Grid.Column="0"
Content="{x:Static mlres:Resources.lastname}"
Margin="5"></Label>
</Grid>
<WrapPanel x:Name="wrp_buttonpanel"
Grid.Row="1"
Grid.Column="0">
<!--Test to get values from the resources-->
<Button x:Name="btn_testresource"
Margin="5"
Click="btn_testresource_Click">Test</Button>
<!--Switch to language german-->
<Button x:Name="btn_switchtogerman"
Margin="5"
Click="btn_switchtogerman_Click"
Content="{x:Static mlres:Resources.switchtogerman}"></Button>
<!--Switch to language english-->
<Button x:Name="btn_switchtoenglish"
Margin="5"
Click="btn_switchtoenglish_Click"
Content="{x:Static mlres:Resources.switchtoenglish}"></Button>
</WrapPanel>
</Grid>
</Window>
C#代码:
public partial class MainWindow : Window
{
/// <summary>
/// The constructor.
/// </summary>
public MainWindow()
{
InitializeComponent();
}
/// <summary>
/// For testing the resource dictionaries.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_testresource_Click(object sender, RoutedEventArgs e)
{
// Shows the name of the current culture.
System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture;
MessageBox.Show("The name of the current culture is '" + ci.Name + "'");
////// Shows the text to the resource key "firstname" according to the current culture.
////ResourceManager rm1 = new ResourceManager("MultipleLanguages.TextResource1", System.Reflection.Assembly.GetExecutingAssembly());
////MessageBox.Show("'firstname' aus MultipleLanguages.TextResource1" + rm1.GetString("firstname"));
////ResourceManager rm2 = new ResourceManager("MultipleLanguages.TextResources.TextResource2", System.Reflection.Assembly.GetExecutingAssembly());
////MessageBox.Show("'firstname' aus MultipleLanguages.TextResources.TextResource2" + rm2.GetString("firstname"));
// Shows values to the given names from the resource - according to the current culture, which was set in App.xaml.cs.
ResourceManager rm = MultipleLanguages.Properties.Resources.ResourceManager;
MessageBox.Show("firstname : " + rm.GetString("firstname"));
MessageBox.Show("lastname : " + rm.GetString("lastname"));
}
private void btn_switchtogerman_Click(object sender, RoutedEventArgs e)
{
((App)Application.Current).SwitchToLanguageGerman();
UpdateLayout();
}
private void btn_switchtoenglish_Click(object sender, RoutedEventArgs e)
{
((App)Application.Current).SwitchToLanguageEnglish();
UpdateLayout();
}
}
启动后,默认语言为德语。
当我切换到英语时,线程的当前文化发生了变化,但我在GUI中看不到任何变化。
但是当我点击“测试”按钮时,我从资源中得到了英语值。
最后,我尝试用UpdateLayout
刷新窗口,但没有任何React。
大疑问:如何在运行时刷新窗口?
P.S.:通过使用XAML而不是RESX,这没有问题(除了来自验证的错误消息)。
1条答案
按热度按时间i34xakig1#
我建议使用ResourceDictionaries而不是. resx文件。在绑定时只使用DynamicResource。当您加载另一个ResourceDictionary时,文本将自动更新。只需按照以下步骤操作:
English.xml ResourceDictionary的内容应如下所示:
您的German.xml ResourceDictionary可能如下所示:
如果您的字典位于另一个组件中,请按如下方式查找它们:
如果你对这种方法有问题,请随时留下评论,我会尽量扩大我的答案。