基于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
原文地址:https://www.cnblogs.com/LifelongLearning/p/1776825.html