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应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的 ...
随机推荐
- 文心一言 VS 讯飞星火 VS chatgpt (172)-- 算法导论13.3 1题
一.用go语言,在 RB-INSERT 的第 16 行,将新插人的结点 z 着为红色.注意到,如果将 z 着为黑色,则红黑树的性质4就不会被破坏.那么为什么不选择将 z 着为黑色呢? 文心一言: 在红 ...
- 实证与虚无,抽象和具象,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang接口(interface)的使用EP08
看到接口这两个字,我们一定会联想到面向接口编程.说白了就是接口指定执行对象的具体行为,也就是接口表示让执行对象具体应该做什么,所以,普遍意义上讲,接口是抽象的,而实际执行行为,则是具象的. 接口(in ...
- C++篇:第六章_指针_知识点大全
C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 六.指针 (一)指针规则 两个指针不能进行加法运算,因为指针是变量,其值是另一个 ...
- MRS大企业ERP流程实时数据湖加工最佳实践
本文分享自华为云社区<MRS大企业ERP流程实时数据湖加工最佳实践>,作者:晋红轻 . 本文将以ERP流程实践为例介绍MRS实时数据湖方案的演进 案例实践需求解析: 业务描述 AE表:会计 ...
- 实践案例丨GaussDB网络重传/丢包问题定位总结
摘要:本文将介绍几种常用手段,用于梳理数据库网络故障可能存在的问题,从而快速定位恢复. 1 问题背景 在GaussDB各类问题场景中,网络故障是最难定位及恢复的问题之一,其不仅可能影响着数据库的性能, ...
- 六一儿童节,看我用ModelArts让8090梦回童年
[本期推荐] 8岁小朋友的儿童节,有点硬核,一起来认识这些小小程序员,看他们如何coding出一个与众不同的童年. 摘要: 如果还能再过一次儿童节-- 本文分享自华为云社区<"梦回童年 ...
- Python图像处理丨带你掌握图像几何变换
摘要:本篇文章主要讲解图像仿射变换和图像透视变换,通过Python调用OpenCV函数实. 本文分享自华为云社区<[Python图像处理] 十二.图像几何变换之图像仿射变换.图像透视变换和图像校 ...
- Solon 框架,maven 单月下载量突破 200 万了!
Solon 是什么开源项目? 一个,Java 新的生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(历时五年,已有全球第二级别的生态规模).与其他框架相比,它解决了两个重要的痛点:启动慢 ...
- PPT 光效果
点状.线状.面状.光影 "光" = PPT高大上的秘密
- Java 日志框架学习笔记
日志概念 1. 日志文件 日志文件是用于记录系统操作事件的文件集合 1.1 调试日志 1.2 系统日志 系统日志是记录系统中硬件.软件和系统问题的信息,同时还可以监视系统中发生的事件.用户可以通过它来 ...