WPF 中英文多語言切換動態載入資源字典的方式
阿新 • • 發佈:2021-08-16
XAML:
<Grid> <StackPanel Margin="20"> <Button x:Name="buttonNewTaskWindow" Height="30" Width="100" Content="{DynamicResource buttonNewTaskWindow}"/> <Button x:Name="buttonProperty" Height="30" Width="100" Margin="0 20 0 0" Content="{DynamicResource buttonProperty}"/> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0 20 0 0"> <RadioButton x:Name="rdbChinese" Content="簡體中文" Checked="rdbChinese_Checked"/> <RadioButton x:Name="rdbFChinese" Content="繁體中文" Checked="rdbFChinese_Checked"/> <RadioButton x:Name="rdbEnglish" Content="English" Checked="rdbEnglish_Checked"/> </StackPanel> </StackPanel> </Grid
CodeBehind:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); rdbChinese.IsChecked = true; } private void rdbEnglish_Checked(object sender, RoutedEventArgs e) { UpdateLanguage(@"en-us.xaml"); } private void rdbChinese_Checked(object sender, RoutedEventArgs e) { UpdateLanguage(@"zh-cn.xaml"); } private void rdbFChinese_Checked(object sender, RoutedEventArgs e) { UpdateLanguage(@"ft.xaml"); } private void UpdateLanguage(string resourcePath) { List<ResourceDictionary> dictionaryList = new List<ResourceDictionary>(); foreach (ResourceDictionary dictionary in Application.Current.Resources.MergedDictionaries) { dictionaryList.Add(dictionary); } ResourceDictionary resourceDictionary = dictionaryList.FirstOrDefault(d => d.Source.OriginalString.Equals(resourcePath)); Application.Current.Resources.MergedDictionaries.Remove(resourceDictionary); Application.Current.Resources.MergedDictionaries.Add(resourceDictionary); } }
zh-cn.xaml :
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:local="clr-namespace:CsWPFTest"> <s:String x:Key="buttonNewTaskWindow">新建任務</s:String> <s:String x:Key="buttonProperty">任務屬性</s:String> </ResourceDictionary>
en-us.xaml :
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:CsWPFTest">
<s:String x:Key="buttonNewTaskWindow">New Task</s:String>
<s:String x:Key="buttonProperty">Task Property</s:String>
</ResourceDictionary>
ft.xaml :
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:CsWPFTest">
<s:String x:Key="buttonNewTaskWindow">新建任務</s:String>
<s:String x:Key="buttonProperty">任務屬性</s:String>
</ResourceDictionary>
App.XAML:
<Application x:Class="CsWPFTest.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CsWPFTest"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ft.xaml"/>
<ResourceDictionary Source="en-us.xaml"/>
<ResourceDictionary Source="zh-cn.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
參考: