c#/.net core/wpf框架初建(国际化、主题色)

english | 简体中文

作为 terminalmacs 的一个子进程模块 – wpf管理端,目前搭建框架部分功能:本地化、国际化、主题色修改等。

导航目录

    1. 框架已添加功能说明
    • 1.1. 国际化、本地化
    • 1.2. metro风格主窗体
    • 1.3. 动态更换主题色
    1. 关于terminalmacs及本wpf管理端
    1. 关于项目开源
    1. 参考资料

1. 框架已添加功能说明

1.1. 国际化、本地化

源码放在github上,希望分享给更多人,所以添加了国际化功能,默认支持中、英、日三国语言,按照已有套路扩展其他语言也方便,看下面的效果:

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

三个资源文件使用需要注意:

    1. 选择一个默认文件(比如en.xaml,英文)作为默认语言文件,需要将生成操作属性设置为 “页”, 设置截图如下:
    1. 其他语言文件设置生成操作属性为内容,设置截图如下:
    1. 需要将默认语言资源文件添加到app.xaml中,其他语言不用:
<application.resources>
        <resourcedictionary>
            <resourcedictionary.mergeddictionaries>
                <resourcedictionary source="i18nresources/en.xaml"/>
......
    1. 在项目初始化时,即加载主窗体之前,需要设置当前语言(加载操作系统语言或者程序上次运行时的配置,即本地化功能),本项目采用prism作为mvvm及模块化框架,所以在createshell方法调用切换语言方法:

app.xaml.cs

protected override window createshell()
        {
            languagehelper.setlanguage();
            return container.resolve<mainwindow>();
        }
    1. 国际化,即在运行期间,动态切换语言,在主窗体中添加语言切换配置菜单,在菜单的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&amp;uin=632871194&amp;site=qq&amp;menu=yes"/>
                <metro:metromenuitem header="{dynamicresource mainmenu_qqgroup}" command="aduopenlink:controlcommands.openlink"
                                     commandparameter="https://jq.qq.com/?_wv=1027&amp;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. 关于项目开源

    1. 开源项目地址:https://github.com/dotnet9/terminalmacs
    1. 官方网站:
    1. 合作网站:

4. 参考资料

    1. 全球化和本地化:
    1. wpf国际化方式1之资源文件:https://www.cnblogs.com/qwqwqaq/p/11595454.html
    1. [wpf]本地化入门:https://www.cnblogs.com/dino623/p/localizationwpf.html
    1. aduskin:https://github.com/aduskin/aduskin
    1. handycontrol:https://github.com/handyorg/handycontrol