C#/.Net Core/WPF框架初建(国际化、主题色)
C#/.Net Core/WPF框架初建(国际化、主题色)
English | 简体中文
作为 TerminalMACS 的一个子进程模块 - WPF管理端,目前搭建框架部分功能:本地化、国际化、主题色修改等。
导航目录
- 框架已添加功能说明
- 1.1. 国际化、本地化
- 1.2. Metro风格主窗体
- 1.3. 动态更换主题色
- 关于TerminalMACS及本WPF管理端
- 关于项目开源
- 参考资料
1. 框架已添加功能说明
1.1. 国际化、本地化
源码放在Github上,希望分享给更多人,所以添加了国际化功能,默认支持中、英、日三国语言,按照已有套路扩展其他语言也方便,看下面的效果:

本项目(TerminalMACS的WPF管理端)使用的资源字典存储翻译文件,其他方式还有资源文件、微软官方的国际化方案(未研究)等。下面是翻译文件截图:

三个资源文件使用需要注意:
- 选择一个默认文件(比如en.xaml,英文)作为默认语言文件,需要将生成操作属性设置为 "页", 设置截图如下:

- 其他语言文件设置生成操作属性为内容,设置截图如下:

- 需要将默认语言资源文件添加到App.xaml中,其他语言不用:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="I18nResources/en.xaml"/>
......
- 在项目初始化时,即加载主窗体之前,需要设置当前语言(加载操作系统语言或者程序上次运行时的配置,即本地化功能),本项目采用Prism作为MVVM及模块化框架,所以在CreateShell方法调用切换语言方法:
App.xaml.cs
protected override Window CreateShell()
{
LanguageHelper.SetLanguage();
return Container.Resolve<MainWindow>();
}
- 国际化,即在运行期间,动态切换语言,在主窗体中添加语言切换配置菜单,在菜单的Tag属性中配置语言文件名,如下:
MainWindow.xaml
<Metro:MetroMenuItem Header="{DynamicResource MainMenu_Language}" >
<Metro:MetroMenuItem Header="中文" Tag="zh-CN" Click="ChangeLanguage_Click"/>
<Metro:MetroMenuItem Header="English" Tag="en" Click="ChangeLanguage_Click"/>
<Metro:MetroMenuItem Header="日本語" Tag="ja" Click="ChangeLanguage_Click"/>
</Metro:MetroMenuItem>
后台代码切换语言:
private void ChangeLanguage_Click(object sender, RoutedEventArgs e)
{
string language = (sender as MetroMenuItem).Tag.ToString();
LanguageHelper.SetLanguage(language);
}
具体的语言设置方法,封装如下:
LanguageHelper.cs
private const string KEY_OF_LANGUAGE = "language";
public static void SetLanguage(string language = "")
{
if (string.IsNullOrWhiteSpace(language))
{
language = ConfigHelper.ReadKey(KEY_OF_LANGUAGE);
if (string.IsNullOrWhiteSpace(language))
{
language = System.Globalization.CultureInfo.CurrentCulture.ToString();
}
}
string languagePath = $@"I18nResources\{language}.xaml";
try
{
var lanRd = Application.LoadComponent(new Uri(languagePath, UriKind.Relative)) as ResourceDictionary;
var old = Application.Current.Resources.MergedDictionaries.FirstOrDefault(o => o.Contains("AppTitle"));
if (old != null)
{
Application.Current.Resources.MergedDictionaries.Remove(old);
}
Application.Current.Resources.MergedDictionaries.Add(lanRd);
ConfigHelper.SetKey(KEY_OF_LANGUAGE, language);
var culture = new System.Globalization.CultureInfo(language);
System.Globalization.CultureInfo.CurrentCulture = culture;
System.Globalization.CultureInfo.CurrentUICulture = culture;
}
catch { }
}
管理端当前语言配置在App.config文件appSettings节点下,第一次发布时,值为空,程序为读取操作系统语言进行本地化设置,然后更新language节点,主窗体动态切换时,也会更新此节点:
App.config
<add key="language" value=""/>
1.2. Metro风格主窗体
使用开源控件库 AduSkin 的 MetroWindow 作为主窗体基类,方便的将菜单添加到标题栏,效果如下:

代码中使用,添加命名空间:
xmlns:Metro="clr-namespace:AduSkin.Controls.Metro;assembly=AduSkin"
修改主窗体基类 Window 为 Metro:MetroWindow,标题栏菜单添加部分代码如下:
<Metro:MetroWindow.Menu>
<Metro:MetroTitleMenu Height="40">
<Metro:MetroTitleMenuItem Header="{DynamicResource MainMenu_Contact}" Icon="/Images/Contact.png">
<Metro:MetroMenuItem Header="QQ" Command="AduOpenLink:ControlCommands.OpenLink"
CommandParameter="http://wpa.qq.com/msgrd?v=3&uin=632871194&site=qq&menu=yes"/>
<Metro:MetroMenuItem Header="{DynamicResource MainMenu_QQGroup}" Command="AduOpenLink:ControlCommands.OpenLink"
CommandParameter="https://jq.qq.com/?_wv=1027&k=50b36fD"/>
<Metro:MetroMenuItem Header="{DynamicResource MainMenu_Email}" Command="AduOpenLink:ControlCommands.OpenLink"
CommandParameter="mailto:632871194@qq.com" />
</Metro:MetroTitleMenuItem>
......
1.3. 动态更换主题色
程序运行过程中,动态修改主题色,效果如图:

配色菜单代码如下:
<Metro:MetroColorPicker x:Name="Theme" Width="50" Height="20" Grid.Column="1"
Background="{StaticResource DefaultBrush}"
DefaultColor="{StaticResource DefaultBrush}" />
注意:需要在后台注册颜色改变事件:
Theme.ColorChange += delegate
{
// Do not bind colors through XAML, unable to get notifications
BorderBrush = Theme.CurrentColor.OpaqueSolidColorBrush;
};
2. 关于TerminalMACS及本WPF管理端
2.1. TermainMACS
多终端资源管理与检测系统,包含多个子进程模块,目前开发了Xamarin.Forms客户端、WPF管理端、.NET Core WEB API服务端,下一步继续完善WPF管理端。
2.2. WPF管理端
作为TerminalMACS系统的一个子进程模块,目前只搭建了简单的框架(未完),添加了国际化、本地化、主题换色等功能,Prism模块化功能待加。
3. 关于项目开源
- 合作网站:https://dotnet9.com

4. 参考资料
- WPF国际化方式1之资源文件:https://www.cnblogs.com/qwqwQAQ/p/11595454.html
- HandyControl:https://github.com/HandyOrg/HandyControl
C#/.Net Core/WPF框架初建(国际化、主题色)的更多相关文章
- ASP.NET Core 6框架揭秘实例演示[01]: 编程初体验
作为<ASP.NET Core 3框架揭秘>的升级版,<ASP.NET Core 6框架揭秘>提供了很多新的章节,同时对现有的内容进行大量的修改.虽然本书旨在对ASP.NET ...
- AVFoundation 框架初探究(二)
接着第一篇总结 系列第一篇地址:AVFoundation 框架初探究(一) 在第一篇的文章中,我们总结了主要有下面几个点的知识: 1.对AVFoundation框架整体的一个认识 2.AVSpeech ...
- .NET Core UI框架Avalonia
.NET Core UI框架Avalonia,Avalonia是一个基于WPF XAML的跨平台UI框架,并支持多种操作系统:Windows(.NET Framework,.NET Core),Lin ...
- 【我们一起写框架】MVVM的WPF框架(一)—序篇
前言 我想,有一部分程序员应该是在二三线城市的,虽然不知道占比,但想来应该不在少数. 我是这部分人群中的一份子. 我们这群人,面对的客户,大多是国内中小企业,或者政府的小部门.这类客户的特点是,资金有 ...
- 【我们一起写框架】MVVM的WPF框架(四)—DataGrid
前言 这个框架写到这里,应该有很多同学发现,框架很多地方的细节,其实是违背了MVVM的设计逻辑的. 没错,它的确是违背了. 但为什么明知道违背设计逻辑,还要这样编写框架呢? 那是因为,我们编写的是框架 ...
- 一个基于Net Core3.0的WPF框架Hello World实例
目录 一个基于Net Core3.0的WPF框架Hello World实例 1.创建WPF解决方案 1.1 创建Net Core版本的WPF工程 1.2 指定项目名称,路径,解决方案名称 2. 依赖库 ...
- [ASP.NET Core 3框架揭秘] 依赖注入[5]: 利用容器提供服务
毫不夸张地说,整个ASP.NET Core框架是建立在依赖注入框架之上的.ASP.NET Core应用在启动时构建管道以及利用该管道处理每个请求过程中使用到的服务对象均来源于依赖注入容器.该依赖注入容 ...
- .Net Core WPF之XAML概述
原文链接,机器翻译,有误处参看原文. XAML overview in WPF 2019/08/08 What is XAML XAML syntax in brief Case and white ...
- Core Foundation框架
转载自:http://blog.csdn.net/weiwangchao_/article/details/7744972 Core Foundation框架 (CoreFoundation.fram ...
- IOS之Core Foundation框架和Cocoa Foundation框架的区别
Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的 ...
随机推荐
- Codeforces #449 div2 C题
C. Nephren gives a riddle time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- 聊聊流式数据湖Paimon(四)
Partial Update 数据打宽 通过不同的流写不同的字段,打宽了数据的维度,填充了数据内容:如下所示: --FlinkSQL参数设置 set `table.dynamic-table-opti ...
- 使用dtd定义属性
- Centos7安装高版本BIND9.16.41(DNS服务器)
安装高版本BIND9.16.41或9.18.15 双数版本为稳定版如9.16.9.18 使用手册:https://bind9.readthedocs.io/en/v9_16_19/reference. ...
- P4928 [MtOI2018]衣服?身外之物! 题解
题意 gcd 共有 \(n\) 件衣服,编号为 \(A_1,A_2,\cdots A_n\). 每一件衣服分别拥有颜色值和清洗时间,他在每一件衣服穿完以后都会将其送去清洗,而这件衣服当天所拥有的舒适感 ...
- 使用NPOI导出Excel,并在Excel指定单元格插入图片
一.添加Nuget引用 二.弹框选择保存路径 string fileName = $"记录_{DateTime.Now.ToString("yyyyMMdd_HHmmss" ...
- 网络性能总不好?网络调优专家AOE帮你来“看看”
摘要:为提升网络性能.降低人工调优成本,CANN推出了自动化网络调优工具AOE,通过子图调优.算子调优与梯度调优的功能,让网络可以在AI硬件上获得最佳性能. 本文分享自华为云社区<网络性能总不好 ...
- 盘点Python 中字符串的常用操作
摘要:盘点 Python 中字符串的几个常用操作,对新手极度的友好. 本文分享自华为云社区<盘点 Python 中字符串的常用操作,对新手极度友好>,作者:TT-千叶 . 在 Python ...
- 带你聚焦GaussDB(DWS)存储时游标使用
摘要:游标是一种数据处理方法,提供了在查询结果集中进行逐行遍历浏览数据的方法,也可以将游标当做上下文区域的句柄或者指针,借助游标对指定位置的数据进行查询与处理. 本文分享自华为云社区<Gauss ...
- 详解4种微服务框架接入Istio方案
摘要:使用k8s和lstio网格进行开发,将服务发现.服务治理留给基础设施,可以将开发人员从复杂的服务中解脱出来,专注于业务开发,是当前来说比较好的解决方案. 本文分享自华为云社区<传统微服务框 ...