WPF实现无刷新动态切换多语言(国际化)

摘要:
确定<确定<键=“取消”>取消&lt/sys;应用程序x;//schemas.microsoft.com/winfx/2006/xaml“StartupUri=”MainWindow.xaml“&gt:ResourceDictionarySource=”langDefaultLanguage.xaml“/>

1. 在WPF中国际化使用的是 .xaml文件的格式

      如图:Resource Dictionary (WPF)

      WPF实现无刷新动态切换多语言(国际化)第1张

2. 创建默认的语言文件和其他语言文件

       这里以英语为默认语言,新建一个 Resource Dictionary (WPF)文件,并命名为DefaultLanguage.xaml,内容如下:   

<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="OK">
        OK
    </sys:String>
    <sys:String x:Key="Cancel">
        Cancel
    </sys:String>
</ResourceDictionary>

   默认语言文件的 BuildAction要设置为 Page,如图:

       WPF实现无刷新动态切换多语言(国际化)第2张

       为了便于管理,一般将所有的语言文件都放在一个目录下,这里创建lang目录,

       然后在创建另一个语言文件,这里是中文,命名为 zh_CN.xaml,内容如下:

<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="OK">
        确定
    </sys:String>

    <sys:String x:Key="Cancel">
        取消
    </sys:String>
</ResourceDictionary>

       其他非默认语言的设置应该如下:

       BuildAction设置为:Content ;CopyToOutputDirectory设置为:Copy if newer (先这样做吧,原因未清)

        WPF实现无刷新动态切换多语言(国际化)第3张

3.在App.xaml中配置默认语言:

<Application x: 
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary><!--这个节点就是配置默认语言的-->
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="langDefaultLanguage.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

4.实际使用(敲代码了) 

     4.1. 界面效果如下:

           WPF实现无刷新动态切换多语言(国际化)第4张

    4.2. 界面的.xaml代码

WPF实现无刷新动态切换多语言(国际化)第5张WPF实现无刷新动态切换多语言(国际化)第6张
 1 <Window x:Class="LanTest.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         Title="MainWindow" Height="350" Width="525">
 5     <Grid>
 6         <!--这里的{DynamicResource OK}就是动态调用 资源中的key为OK的内容-->
 7         <Button Content="{DynamicResource OK}" HorizontalAlignment="Left" Margin="134,161,0,0" VerticalAlignment="Top" Width="104" Height="38"/>
 8         <Button Content="{DynamicResource Cancel}" HorizontalAlignment="Left" Margin="278,161,0,0" VerticalAlignment="Top" Width="100" Height="38"/>
 9         <Button Content="Button" HorizontalAlignment="Left" Margin="287,59,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click" Loaded="Button_Loaded"/>
10         <ComboBox Name="cbLang" HorizontalAlignment="Left" Margin="118,59,0,0" VerticalAlignment="Top" Width="120">
11         </ComboBox>
12 
13     </Grid>
14 </Window>
View Code

    4.3. 后台逻辑代码:

WPF实现无刷新动态切换多语言(国际化)第5张WPF实现无刷新动态切换多语言(国际化)第8张
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Globalization;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7 using System.Windows;
 8 using System.Windows.Controls;
 9 using System.Windows.Data;
10 using System.Windows.Documents;
11 using System.Windows.Input;
12 using System.Windows.Media;
13 using System.Windows.Media.Imaging;
14 using System.Windows.Navigation;
15 using System.Windows.Shapes;
16 
17 namespace LanTest
18 {
19     /// <summary>
20     /// Interaction logic for MainWindow.xaml
21     /// </summary>
22     public partial class MainWindow : Window
23     {
24         public MainWindow()
25         {
26             InitializeComponent();
27         }
28 
29         //定义ComboBox选项的类,存放Name和Value
30         public class CategoryInfo
31         {
32             public string Name
33             {
34                 get;
35                 set;
36             }
37             public string Value
38             {
39                 get;
40                 set;
41             }
42 
43         }
44 
45         //切换语言
46         private void btnChangeLang_Click(object sender, RoutedEventArgs e)
47         {
48             object selectedName = cbLang.SelectedValue;
49             if (selectedName != null)
50             {
51                 string langName = selectedName.ToString();
52                 //英语的语言文件名为:DefaultLanguage,所有这里要转换一下
53                 if (langName == "en_US")
54                     langName = "DefaultLanguage";
55                 //根据本地语言来进行本地化,不过这里上不到
56                 //CultureInfo currentCultureInfo = CultureInfo.CurrentCulture;
57 
58                 ResourceDictionary langRd = null;
59                 try
60                 {
61                     //根据名字载入语言文件
62                     langRd = Application.LoadComponent(new Uri(@"lang" + langName + ".xaml", UriKind.Relative)) as ResourceDictionary;
63                 }
64                 catch(Exception e2)
65                 {
66                     MessageBox.Show(e2.Message);
67                 }
68 
69                 if (langRd != null)
70                 {
71                     //如果已使用其他语言,先清空
72                     if (this.Resources.MergedDictionaries.Count > 0)
73                     {
74                         this.Resources.MergedDictionaries.Clear();
75                     }
76                     this.Resources.MergedDictionaries.Add(langRd);
77                 }
78             }
79             else
80                 MessageBox.Show("Please selected one Language first.");
81         }
82 
83         //控件载入时,为ComboBox赋值
84         private void cbLang_Loaded(object sender, RoutedEventArgs e)
85         {
86             List<CategoryInfo> categoryList = new List<CategoryInfo>();
87             categoryList.Add(new CategoryInfo() { Name = "English", Value = "en_US" });
88             categoryList.Add(new CategoryInfo() { Name = "中文", Value = "zh_CN" });
89             
90             cbLang.ItemsSource = categoryList;//绑定数据,真正的赋值
91             cbLang.DisplayMemberPath = "Name";//指定显示的内容
92             cbLang.SelectedValuePath = "Value";//指定选中后的能够获取到的内容
93         }
94     }
95 }
View Code

    

免责声明:文章转载自《WPF实现无刷新动态切换多语言(国际化)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇美团外卖自动化业务运维系统adb 通过局域网 连接并操作手机下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PHP 原生实现MVC框架

2017-6-5 由于工作需要 打算自己实现一个简单的  MVC框架以完成工作需求   初步定义 框架需要完成的工作 1.单入口的路由功能 2.文件的自动载入 3.流水ID的加密以及自动解密 4.MVC文件夹模式 5.通用模板的引用     单入口的路由实现   项目接口的 public 目录中存在一个index.php 文件 作为 项目的唯一入口   文...

svg 不同比例缩放后 拖拽事件的鼠标位置转换为svg图纸中的位置

说起来可能有点绕,下面尽可能的把我想表达的表述清楚吧 来看下下面这张图 svg元素的宽度和浏览器的宽度是不一样的,事实上,还有一个宽度,那就是svg画布的宽度 为什么会有这么多不一样的宽度呢,直接浏览器的宽高就是svg标签的宽高,同时也设置同样的画布宽高,不就不用转换拖拽事件鼠标的坐标位置了吗? 是这么个道理,一开始我也是这么干的,可是后来发现,不同客户...

vector数组的遍历

1.front()访问第一个元素(第一个元素的值而不是地址!begin()相反) 2.back()访问最后一个元素(最后一个元素的值而不是地址!end()相反) 3.size()数组的元素个数 vector<int> a; //像数组一样以下标访问 for(int i = 0; i < a.size(); i++) { co...

C#解析json的两种方式

    C#中Json转换主要使用的几种方法! 这篇主要介绍2、4。第三种方法使用的比较局限,所以我没有深入学习。 第二种方法   我使用比较多的方式,这个方法是.NET内置的,使用起来比较方便 A、利用serializer获取json的泛型对象 利用Dictionary<string,object>接收转换完的json对象,然后用查询泛型...

MindManager Pro 9.1.157更改默认字体

新创建图表内默认字体 打开MindManager模型存放目录:C:\Documents and Settings\(用户名)\Local Settings\Application Data\Mindjet\MindManager\9\Library\ENU\Templates\,打开New Blank Map.mmat此文件,在“Central Topi...

安装phpldapadmin

1. 安装软件 [root@ ~]# yum -y install epel-release [root@ ~]# yum install -y phpldapadmin 2. 配置phpldapadmin [root@ ~]# vi /etc/httpd/conf.d/phpldapadmin.conf # # Web-based tool for...