zoukankan      html  css  js  c++  java
  • 基于WinForm的多语言开发之界面加载

         在“基于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;
            }
     

    实际运行中如下图所示:

    image

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

    如Label 以lbl开头

    Button 以btn开头

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

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

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

    对资源文件的命名如下:

    image

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

    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);
            }
     

    实际运行效果如下:

    image

    源码下载:源码下载

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

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

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

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

    Bookmark and Share
  • 相关阅读:
    mysql怎么导入大文件的sql文件
    php函数研究
    php实现实现代码多主从,切换,轮询,健康检查
    php实现单个用户禁止重复登录,防止同一用户同时登陆
    php使用p3p实现cookies跨域设置 实现单点登录,全站登录
    实现页面浏览统计
    遍历目录删除指定MD5值的文件
    boot.img的修改
    “逃离大厦”游戏的破解
    Android漏洞——将Android恶意代码隐藏在图片中
  • 原文地址:https://www.cnblogs.com/LifelongLearning/p/1776825.html
Copyright © 2011-2022 走看看