举例中英文切换:

一、静态切换(每次切换需要重启应用)

1. 新建一个WPF APP(.NET Framework)项目,StaticLanguageSelect

2. 右击项目名,添加New Item,选择Resources File类型,取名为Resources.en-us.resx,把该文件拖放到Properties下,如图:

3. 使用键值对形式,在Resources.resx中存储所需的中文表示,在Resources.en-us.resx中存储所需的英文表示,如图:

注意:中文资源文件Resources.resx的Access Modifier要改成public

4. 在Properties下的Settings.settings中,新建一项,用来存储当前线程的Culture。(初始值Value为空,因为后面设置了首次启动适应系统环境。)

后面代码中用到CultureInfo类,是.NET Framework自带的支持多种语言环境和习惯的类,这可以使同一个数据适应不同地区和文化,满足处于不同地区和文化的用户。

5. 接下来在MainWindows.xaml和MainWindows.xaml.cs中写处理代码。

注意:对于.NET Framework 4.5.2版本,这样写在窗体主函数中才起作用,.NET Framework 4.6.2等高版本需要尝试写在APP.xaml.cs中。

 1 <Window x:Class="StaticLanguageSelect.MainWindow"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6 xmlns:p="clr-namespace:StaticLanguageSelect.Properties"
7 xmlns:local="clr-namespace:StaticLanguageSelect"
8 mc:Ignorable="d"
9 Title="MainWindow" Height="450" Width="800">
10 <Grid>
11 <StackPanel>
12 <TextBlock Text="{x:Static p:Resources.String1}"/>
13 <Button Content="{x:Static p:Resources.SelectLanguage}" Click="Button_Click"/>
14 <Button Content="{x:Static p:Resources.Show}" Click="Button2_Click"/>
15 </StackPanel>
16 </Grid>
17 </Window>
 1 using StaticLanguageSelect.Properties;
2 using System.Diagnostics;
3 using System.Globalization;
4 using System.Resources;
5 using System.Threading;
6 using System.Threading.Tasks;
7 using System.Windows;
8
9 namespace StaticLanguageSelect
10 {
11 /// <summary>
12 /// Interaction logic for MainWindow.xaml
13 /// </summary>
14 public partial class MainWindow : Window
15 {
16 private string _name;
17 private ResourceManager _currentResource;
18
19 public MainWindow()
20 {
21 var cultureName = Settings.Default.CultureName;
22
23 //如果Settings中的CultureName不为空,就实例化该种CultureInfo实例,使用它。
24 if (!string.IsNullOrEmpty(cultureName))
25 {
26 try
27 {
28 var cultureInfo = new CultureInfo(cultureName);
29 CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
30 CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;
31 }
32 catch (CultureNotFoundException)
33 {
34 throw;
35 }
36 }
37
38 //获取到当前线程的Culture,赋值到Settings设置中,并保存。
39 Settings.Default.CultureName = Thread.CurrentThread.CurrentUICulture.Name;
40 Settings.Default.Save();
41
42 //实例化ResourceManager,来获得当前的Resource配置。
43 _currentResource = new ResourceManager("StaticLanguageSelect.Properties.Resources", typeof(Resources).Assembly);
44
45 InitializeComponent();
46 }
47
48 private void Button_Click(object sender, RoutedEventArgs e)
49 {
50 Settings.Default.CultureName = Thread.CurrentThread.CurrentUICulture.Name == "en-US" ? "zh-CN" : "en-US";
51 Settings.Default.Save();
52
53 Task.Delay(500);
54
55 //重启WPF程序
56 Process.Start(Application.ResourceAssembly.Location);
57 Application.Current.Shutdown();
58 }
59
60 private void Button2_Click(object sender, RoutedEventArgs e)
61 {
62 _name = _currentResource.GetString("Name");
63 MessageBox.Show(_name);
64 }
65 }
66 }

6. 在弹出的子窗体中也关联当前语言:

新建子窗体ChildWindow,后台代码不用写,直接在xaml中关联资源文件中的语言键值对:

<Window x:Class="StaticLanguageSelect.ChildWindow"
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:p="clr-namespace:StaticLanguageSelect.Properties"
xmlns:local="clr-namespace:StaticLanguageSelect"
mc:Ignorable="d"
Title="ChildWindow" Height="200" Width="300">
<Grid>
<TextBlock Text="{x:Static p:Resources.String1}"/>
</Grid>
</Window>

主窗体按钮的点击处理程序中,实例化子窗体并显示它:

1 private void Button2_Click(object sender, RoutedEventArgs e)
2 {
3 var childWindow = new ChildWindow();
4 childWindow.ShowDialog();
5 }

运行程序会发现,子窗体的语言与主窗体的一致:

最新文章

  1. oracle中时间处理
  2. POJ1080Human Gene Functions(LCS变形)
  3. Fragment 的用法小技巧
  4. 网易云课堂_C++程序设计入门(上)_第4单元:物以类聚 – 对象和类_第4单元作业【3】- 在线编程(难度:难)
  5. 快速排序原理、复杂度分析及C语言实现
  6. HTML5系列之——applicationCache对象
  7. python教你用微信每天给女朋友说晚安
  8. XSS,CSRF,Cookie防劫持的处理
  9. hyper-v下的ubuntu虚拟机分辨率修改
  10. node.js(基础四)_express基础
  11. ionic的学习-02路由中的几个参数
  12. Cocos2d-X开发教程-捕鱼达人 Cocos2-x development tutorial - fishing talent
  13. linux centos 7上运行teamviewer与找不到ID问题处理办法
  14. 使用Netcat进行攻击
  15. 【58沈剑架构系列】mysql并行复制优化思路
  16. jquery ui autocomplete 模拟百度搜索自动提示
  17. docker-compose写法收集
  18. XP下,移动窗口产生重影的问题
  19. C#事件2
  20. UPDATE SQL 不同环境执行结果不一样

热门文章

  1. Webpack之 webpack-dev-server 中的 contentBase配置及作用
  2. docker简单介绍。
  3. 社交网络分析的 R 基础:(一)初探 R 语言
  4. 在java中静态方法与非静态方法
  5. JAVA多线程学习八-多个线程之间共享数据的方式
  6. bom案例4-模拟滚动条
  7. 转载_最值得阅读学习的10个C语言开源项目代码
  8. 阿里云无法ping通解决
  9. Springboot+Redisson自定义注解一次解决重复提交问题(含源码)
  10. kali中安装arpspoof 报错