史上最简单的WPF多语言切换方案
创作时间:
作者:
@小白创作中心
史上最简单的WPF多语言切换方案
引用
CSDN
1.
https://blog.csdn.net/u013319633/article/details/139009471
本文介绍了一种简单易用的WPF多语言切换方案,通过QS.WPF.Toolkit.GlobalizationSourceGenerator包,开发者可以快速实现界面的多语言支持。
前言
作为技术而言,我并不认为多语言有什么值得深入研究的地方,本来也没打算开这个话题。前段时间看到了群里有朋友在讨论这个,一想到它确实也算一个比较常用的功能,所以决定对它做一个封装,如果您正好需要,希望对您有帮助。
一、使用步骤
1.1 新建WPF项目,引用NuGet包“QS.WPF.Toolkit.GlobalizationSourceGenerator”;
dotnet add package QS.WPF.Toolkit.GlobalizationSourceGenerator --version 1.0.1
1.2 添加资源文件(名称为Resource.resx或Resources.resx);
1.2.1 将资源文件的访问修饰符改为Public(鼠标双击Resource.resx文件打开);
1.2.2 添加多语言版本文字(建议使用ResX Manager);
当然你也可以自己添加,以下是添加后的效果。
1.3 在界面上绑定资源
<Window
x:Class="WpfApp20.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:local="clr-namespace:WpfApp20"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:res="clr-namespace:WpfApp20.Resources"
Title="MainWindow"
Width="800"
Height="450"
mc:Ignorable="d">
<Grid>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="{Binding Source={x:Static res:ResourceExtension.Instance}, Path=Welcome}" />
</Grid>
</Window>
智能提示可用
设计视图可用
1.4 语言切换
xaml
<Window
x:Class="WpfApp20.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:local="clr-namespace:WpfApp20"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:res="clr-namespace:WpfApp20.Resources"
Title="MainWindow"
Width="800"
Height="450"
FontSize="16"
mc:Ignorable="d">
<Grid>
<StackPanel
Margin="0,2,2,0"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Orientation="Horizontal">
<Button Width="80" Click="Button_Click">中文</Button>
<Button Width="80" Click="Button_Click_1" Margin="2,0,0,0">English</Button>
</StackPanel>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="{Binding Source={x:Static res:ResourceExtension.Instance}, Path=Welcome}" />
</Grid>
</Window>
cs
using System.Windows;
namespace WpfApp20
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
WpfApp20.Resources.ResourceExtension.Instance.CurrentCulture = "zh-CN";
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
WpfApp20.Resources.ResourceExtension.Instance.CurrentCulture = "en-US";
}
}
}
完成后效果
二、实现原理
细心的朋友可能第一个疑问就是ResourceExtension这个类怎么来的,这里使用了一个叫源码生成器的技术(如果没了解过可以自行搜索,了解的话自行略过),它是在编译阶段执行的,通过这个特性,我们可以在编译阶段读取Resource文件,然后根据这个文件里的静态属性来生成ResourceExtension类,这个类实现了属性通知的功能,当CurrentCulture属性被更改后,会循环调用OnPropertyChanged方法来触发所有的属性通知事件,如此就实现了运行时的语言切换。如果对生成的源代码感兴趣可以在项目依赖项的分析器下找到生成的代码。
三、疑问解答
3.1 支持的.Net版本有哪些?
.Net Framework>=4.5,.Net Core>=5.0。
3.2 为什么资源文件名必须是Resource或Resources?
因为在.Net Framework WPF项目中,资源文件名默认是Resources,而在.Net Core WPF中资源文件名默认是Resource。
3.3 在.Net Framework WPF项目中引用这个包不起作用?
.Net Framework项目中使用源生器目前只能手动添加,建议在.Net Core项目中编译成多目标框架版本的方式使用,如果确实要在.Net Framework版本中使用,可以给我留言。
热门推荐
南通森林野生动物园亲子游攻略:动物互动、科普教育、精彩表演一网打尽
元旦打卡南通野生动物园特色游玩项目
七彩小乌龟真相:染色危害大,科学护理是关键
一文掌握七彩小乌龟养殖要点:环境、饮食与健康管理
七彩小乌龟:人工染色的巴西红耳滑龟,科学养殖指南
监理工程师职业发展路径与前景展望
优思学院 | SQE供应商质量工程师的面试技巧和示例
醉酒侵犯的法律责任:从法律条文到案例分析
醉酒后竟敢袭警?解析醉酒心理机制
醉酒侵害频发,如何防范?
重庆警方通报:醉酒女子殴打外卖员被刑拘,事件引发社会关注
深圳市消委会实测:爆炸盐清洁效果究竟如何?
爆炸盐清洁小窍门,你get了吗?
环保清洁新宠:爆炸盐 vs 无磷洗衣液
爆炸盐:清洁界的“小炸弹”到底有多强?
一只黄鼠狼一年能吃掉3000只老鼠,还是杂食性“环保卫士”
黄鼠狼不是顶级捕食者,但对生态平衡至关重要
农田守护神黄鼠狼:捕鼠能手却面临生存危机
中元节“见鬼”现象背后的科学原理
中国汽车工业:以技术创新回应质疑,新能源领域引领全球
国产汽车芯片迎来突破,多家车企加速布局芯片赛道
香港创意产业四大领域齐头并进,打造亚洲创意枢纽
外贸获客全渠道指南:从线上平台到线下展会
15元就能吃海鲜?普宁捞面用料足到让人惊叹
项目合作如何管理团队
佛教中的鬼魂:轮回受苦与解脱可能
医生提醒:阑尾炎的5大早期信号,出现就要就医
忠义千秋:三国诗词中的关羽过五关
新书《行走世界 500处历史战场》:实地探访古今著名战役遗址
彭罗斯量子意识理论遭质疑:大脑如何维持量子态成关键