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应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的 ...
随机推荐
- NetSuite 开发日记 —— 非空判断
使用N/util模块进行非空判断,N/util模块说明:https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_45 ...
- 使用cgroup控制CPU使用率
关键文件 cpu子系统中的关键文件. cpu.cfs_period_us cpu.cfs_quota_us tasks cgroup.procs 常用命令 查看当前系统内的CPU. lscpu 查看当 ...
- Ubuntu修改root可以远程ssh
默认情况下,Ubuntu系统不允许root远程登录,新建的系统root密码为随机密码,你不会知道首次ssh登录需要用自建用户远程登录,登录后提示如下: seafile@seafile:~$ 是以 ~ ...
- 如何构建一个 NodeJS 影院微服务并使用 Docker 部署
如何构建一个 NodeJS 影院微服务并使用 Docker 部署 前言 如何构建一个 NodeJS 影院微服务并使用 Docker 部署.在这个系列中,将构建一个 NodeJS 微服务,并使用 Doc ...
- 2023-08-08:给你一棵 n 个节点的树(连通无向无环的图) 节点编号从 0 到 n - 1 且恰好有 n - 1 条边 给你一个长度为 n 下标从 0 开始的整数数组 vals 分别表示每个节
2023-08-08:给你一棵 n 个节点的树(连通无向无环的图) 节点编号从 0 到 n - 1 且恰好有 n - 1 条边 给你一个长度为 n 下标从 0 开始的整数数组 vals 分别表示每个节 ...
- vue获取公网ip
<template> <div> <div>Your Public IP: {{publicIP}}</div> </div> </t ...
- 【玩转鲲鹏DevKit系列】何如快速迁移有源码应用
本文分享自华为云社区<[玩转鲲鹏DevKit系列]何如快速迁移有源码应用>,作者:华为云社区精选 . 源码(也称源程序)是程序员编写的计算机程序的文本形式,不同的编程语言有不同的语法和规则 ...
- 面试官让列举Spring的事务会失效的场景,我说了8个
本文分享自华为云社区<哪些场景下Spring的事务会失效?>,作者:冰 河 . 在日常工作中,如果对Spring的事务管理功能使用不当,则会造成Spring事务不生效的问题.而针对Spri ...
- 想学AI开发很简单:只要你会复制粘贴
摘要:本次实践基于 mobilenetV2 实现猫狗图像分类,贯穿了数据集获取及处理.预训练模型微调及迁移.端侧部署及推理等环节和知识点,体会到了 MindSpore 简单的开发体验和全场景快速部署的 ...
- 论文复现丨基于ModelArts实现Text2SQL
摘要:该论文提出了一种基于预训练 BERT 的新神经网络架构,称为 M-SQL.基于列的值提取分为值提取和值列匹配两个模块. 本文分享自华为云社区<基于ModelArts实现Text2SQL&g ...