基于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;
}
实际运行中如下图所示:
下面我以第二种方法来实现界面加载,首先要求对控件的名称进行统一命名:
如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内的所有文章如非特别注明,版权均归作者个人所有,任何外部引用或摘抄请注明原文地址,未经作者授权不得用于任何以营利目的的行为,谢谢合作!
-------------------------------------------------------------------------------------------------------------------
- 多语言资源文件编辑插件:
- 此插件支持VS2005,2008,2010
- 和VS接合紧密,使用多语言资源文件的编辑非常简单
- 减少你多语言开发时的工作量
- 下载地址:工具下载
-------------------------------------------------------------------------------------------------------------------