在“基于WinForm的多语言软件开发”一文中,说明加载统一加载资源文件和动态刷新界面的方法,现在使用上篇文章中介绍的方法,怎样来快速开发界面。

对资源的的加载有两种方法,一种是用虚拟方法直接加载资源到界面控件中,另一种是用反射的方式来进行加载,这种方式需要一些编辑技巧。

定义下面的基类:

public class FormBase : Form
    {
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e); if (!DesignMode)
            {
                // this.Icon = Properties.Resources.MainIcon;         
                LanguageHelper.LanguageChanged += LanguageHelper_LanguageChanged;
                LanguageHelper_LanguageChanged(null, null);
            }
        }
        void LanguageHelper_LanguageChanged(object sender, LanguageChangedEventArgs e)
        {
            if (!DesignMode)
            {
                //加ó载?刷¢新?窗°体?的?代ú码?,?这a里?可é以?调÷用?一?个?虚é拟a方?法¨,?让?子ó类à来′处|理í刷¢新? 
                LoadResourceUI();
            }
        }
        protected override void OnClosed(EventArgs e)
        {
            if (!DesignMode)
            {
                LanguageHelper.LanguageChanged -= LanguageHelper_LanguageChanged;
            } base.OnClosed(e);
        }
 
// ReSharper disable InconsistentNaming
        protected virtual void LoadResourceUI()
// ReSharper restore InconsistentNaming
        {
 
        }
 

在子类中重载方法

protected override void LoadResourceUI()
        {
            lblLanguage.Text = Properties.Resources.Language;
            btnAddForm.Text = Properties.Resources.AddForm;
        }
 

实际运行中如下图所示:

下面我以第二种方法来实现界面加载,首先要求对控件的名称进行统一命名:

如Label 以lbl开头

Button 以btn开头

设置这样的编码规范后,还要对资源文件的制作进行限制:

如下面窗口中对控件命名如下:

private System.Windows.Forms.Button btnAddForm;
       private System.Windows.Forms.Label lblLanguage;
 

对资源文件的命名如下:

通过如下帮助类,进行资源加载,代码如下:

public static class FreshUI
    {
        static Dictionary<Type, IProcess> dic = new Dictionary<Type, IProcess>();
        static FreshUI()
        {
            dic.Add(typeof(Form), new FormProcess());
            dic.Add(typeof(Label), new LabelProcess());
            dic.Add(typeof(Button), new ButtonProcess());
        }
        internal static void FreshUIControl(Control c)
        {
            if (c is Form)
            {
                dic[typeof(Form)].ProcessControl(c);
 
            }
            else
            {
                if (c is UserControl)
                {
 
                }
                else
                {
                    if (dic.ContainsKey(c.GetType()))
                        dic[c.GetType()].ProcessControl(c);
 
                }
            }
 
            foreach (Control control in c.Controls)
            {
                FreshUIControl(control);
            }
        }
        internal static T GetResourceObject<T>(string name, string preFix)
        {
            name = FixName(name, preFix);
 
            var pi = typeof(Properties.Resources).GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
            if (pi != null)
            {
                var ob = pi.GetValue(null, null);
                if (ob != null)
                {
                    if (ob is T)
                    {
                        return (T)ob;
                    }
                }
            }
 
            return default(T);
        }
        private static string FixName(string name, string preFix)
        {
            if (preFix != "")
            {
                name = name.Replace(preFix, "");
            }
 
            return name;
        }
    }
 
    public abstract class Process<T> : IProcess where T : System.Windows.Forms.Control
    {
        public void ProcessControl(Object t)
        {
            if (t == null)
            {
                return;
            }
 
            ProcessT((T)t);
        }
        public abstract void ProcessT(T t);
    }
 
    public interface IProcess
    {
        void ProcessControl(object t);
    }
 
    public class FormProcess : Process<Form>
    {
        #region IProcess<Form> 成é员±
 
        public override void ProcessT(Form f)
        {
            f.Text = FreshUI.GetResourceObject<string>(f.Name, "");
        }
        #endregion
    }
 
    public class LabelProcess : Process<Label>
    {
 
        #region IProcess<Label> 成é员±
 
        public override void ProcessT(Label t)
        {
            t.Text = FreshUI.GetResourceObject<string>(t.Name, "lbl");
        }
 
        #endregion
    }
 
    public class ButtonProcess : Process<Button>
    {
 
        #region IProcess<Button> 成é员±
 
        public override void ProcessT(Button t)
        {
            t.Text = FreshUI.GetResourceObject<string>(t.Name, "btn");
        }
 
        #endregion
    }
 

在代码中,进行如下调用:

protected override void LoadResourceUI()
        {
            FreshUI.FreshUIControl(this);
        }
 

实际运行效果如下:

源码下载:源码下载

版权声明: 本Blog内的所有文章如非特别注明,版权均归作者个人所有,任何外部引用或摘抄请注明原文地址,未经作者授权不得用于任何以营利目的的行为,谢谢合作!

-------------------------------------------------------------------------------------------------------------------

  1. 多语言资源文件编辑插件:
  2. 此插件支持VS2005,2008,2010
  3. 和VS接合紧密,使用多语言资源文件的编辑非常简单
  4. 减少你多语言开发时的工作量
  5. 下载地址:工具下载

-------------------------------------------------------------------------------------------------------------------

转载于:https://www.cnblogs.com/LifelongLearning/archive/2010/07/13/1776825.html

基于WinForm的多语言开发之界面加载相关推荐

  1. 【个人作品】推荐一个SIP客户端-软电话,基于SIP协议,语言C++,界面QT4 开源,asterisk,tribox测试成功

    推荐一个SIP客户端-软电话,基于SIP协议,语言C++,界面QT4 开源,asterisk,tribox测试成功 属于个人独创作品,欢迎使用测试,欢迎与作者联系,共同研究.如果大家喜欢将拿出源码. ...

  2. 【学习分享】2、创龙 TMS320C6748开发板程序加载和烧写(一)

    此部分由于篇幅过长,将分为五个小点进行叙述,此处主讲基于仿真器的程序加载和烧写,所用器件为创龙TMS320C6748开发板.需要注意的点已在备注中进行说明. 如果需要从头开始进行本使用手册的阅读,欢迎 ...

  3. 【学习分享】2、创龙 TMS320C6748开发板程序加载和烧写(二)

    此部分由于篇幅过长,将分为五个小点进行叙述,此处主讲基于串口的程序加载和烧写,所用器件为创龙TMS320C6748开发板.需要注意的点已在备注中进行说明. 如果需要从头开始进行本使用手册的阅读,欢迎阅 ...

  4. Win8开发中如何加载字符串资源(C#)

    Win8开发中如何加载字符串资源(C#) 你可以从资源文件或库等对象中加载字符串资源. 创建资源文件的方法: 在资源项目或库.控件.软件开发包中创建一个Strings文件夹在文件夹,然后在他的下面在创 ...

  5. 基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)

    基于Android官方AsyncListUtil优化经典ListView分页加载机制(二) 我写的附录文章1,介绍了如何使用Android官方的分页加载框架AsyncListUtil优化改进常见的Re ...

  6. go语言 不支持动态加载_动态语言支持

    go语言 不支持动态加载 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它 ...

  7. Android插件化开发之动态加载本地皮肤包进行换肤

    Android插件化开发之动态加载本地皮肤包进行换肤 前言: 本文主要讲解如何用开源换肤框架 android-skin-loader-lib来实现加载本地皮肤包文件进行换肤,具体可自行参考框架原理进行 ...

  8. 极智开发 | Go 热加载之 fresh

      欢迎关注我的公众号 [极智视界],获取我的更多笔记分享   大家好,我是极智视界,本文介绍一下 Go 热加载之 fresh.   热加载是指可以在不重启服务的情况下,保存后即可让更改的代码生效的一 ...

  9. 【学习分享】2、创龙 TMS320C6748开发板程序加载和烧写(四)

    此部分由于篇幅过长,将分为五个小点进行叙述,此处主讲基于SD卡烧写程序到NAND FLASH,所用器件为创龙TMS320C6748开发板.需要注意的点已在备注中进行说明. 如果需要从头开始进行本使用手 ...

  10. Qt界面加载网络摄像头,并实时显示,两种更新界面的方法

    Qt界面加载网络摄像头,并实时显示,两种更新界面的方法 1.Qt界面加载网络摄像头,并实时显示,根据头文件中的宏定义来区分使用哪种方式.①Qt信号槽更新界面,②c语言回调方式更新界面 2.使用Open ...

最新文章

  1. Python全栈开发day2
  2. oracle数据类型--数值类型
  3. 关闭页面那点事儿...
  4. 数据库 查询XML XQuery
  5. Android Studio 如何修改项目名称
  6. js ajax异步提交,jquery ajax异步提交表单数据的方法
  7. 人人网惨遭全网下架,但是我并不同情他!
  8. 儿童学写字.exe.CR.rar.eml
  9. 文本表示(一)—— word2vec(skip-gram CBOW) glove, transformer, BERT
  10. 品达通用权限系统(Day 1~Day 2)
  11. d3.js画金庸小说力导向图
  12. Windows常用快捷组合键整理Dos命令基础集合
  13. IOS (不越狱)网络抓包
  14. Gerrit快速安装手册
  15. 3天增粉10W+,这是活动的全程复盘
  16. autopilot_donkey car
  17. bs4 Beautiful Soup详解
  18. react实现聊天界面_使用react做的聊天对话列表
  19. L2-040 哲哲打游戏(模拟题)
  20. CREO工程图设计 2D出图 图纸设计视频教程

热门文章

  1. 自己做的一些练习题代码
  2. 提高开发效率的 Eclipse 实用操作
  3. SecureCRT中文显示乱码的解决方法
  4. jdk在Windows下为什么要配置环境变量(引用)
  5. Mysql表编码查看修改
  6. (转载)PHP 判断常量,变量和函数是否存在
  7. Java过滤emoji表情,找出emoji的unicode范围。
  8. PageAdmin网站建设教程:仿58同城站群系统实现不同地区Ip跳转不同分站
  9. 模板 - 多项式快速插值
  10. linux basename学习