基于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接合紧密,使用多语言资源文件的编辑非常简单
- 减少你多语言开发时的工作量
- 下载地址:工具下载
-------------------------------------------------------------------------------------------------------------------
转载于:https://www.cnblogs.com/LifelongLearning/archive/2010/07/13/1776825.html
基于WinForm的多语言开发之界面加载相关推荐
- 【个人作品】推荐一个SIP客户端-软电话,基于SIP协议,语言C++,界面QT4 开源,asterisk,tribox测试成功
推荐一个SIP客户端-软电话,基于SIP协议,语言C++,界面QT4 开源,asterisk,tribox测试成功 属于个人独创作品,欢迎使用测试,欢迎与作者联系,共同研究.如果大家喜欢将拿出源码. ...
- 【学习分享】2、创龙 TMS320C6748开发板程序加载和烧写(一)
此部分由于篇幅过长,将分为五个小点进行叙述,此处主讲基于仿真器的程序加载和烧写,所用器件为创龙TMS320C6748开发板.需要注意的点已在备注中进行说明. 如果需要从头开始进行本使用手册的阅读,欢迎 ...
- 【学习分享】2、创龙 TMS320C6748开发板程序加载和烧写(二)
此部分由于篇幅过长,将分为五个小点进行叙述,此处主讲基于串口的程序加载和烧写,所用器件为创龙TMS320C6748开发板.需要注意的点已在备注中进行说明. 如果需要从头开始进行本使用手册的阅读,欢迎阅 ...
- Win8开发中如何加载字符串资源(C#)
Win8开发中如何加载字符串资源(C#) 你可以从资源文件或库等对象中加载字符串资源. 创建资源文件的方法: 在资源项目或库.控件.软件开发包中创建一个Strings文件夹在文件夹,然后在他的下面在创 ...
- 基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)
基于Android官方AsyncListUtil优化经典ListView分页加载机制(二) 我写的附录文章1,介绍了如何使用Android官方的分页加载框架AsyncListUtil优化改进常见的Re ...
- go语言 不支持动态加载_动态语言支持
go语言 不支持动态加载 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它 ...
- Android插件化开发之动态加载本地皮肤包进行换肤
Android插件化开发之动态加载本地皮肤包进行换肤 前言: 本文主要讲解如何用开源换肤框架 android-skin-loader-lib来实现加载本地皮肤包文件进行换肤,具体可自行参考框架原理进行 ...
- 极智开发 | Go 热加载之 fresh
欢迎关注我的公众号 [极智视界],获取我的更多笔记分享 大家好,我是极智视界,本文介绍一下 Go 热加载之 fresh. 热加载是指可以在不重启服务的情况下,保存后即可让更改的代码生效的一 ...
- 【学习分享】2、创龙 TMS320C6748开发板程序加载和烧写(四)
此部分由于篇幅过长,将分为五个小点进行叙述,此处主讲基于SD卡烧写程序到NAND FLASH,所用器件为创龙TMS320C6748开发板.需要注意的点已在备注中进行说明. 如果需要从头开始进行本使用手 ...
- Qt界面加载网络摄像头,并实时显示,两种更新界面的方法
Qt界面加载网络摄像头,并实时显示,两种更新界面的方法 1.Qt界面加载网络摄像头,并实时显示,根据头文件中的宏定义来区分使用哪种方式.①Qt信号槽更新界面,②c语言回调方式更新界面 2.使用Open ...
最新文章
- Python全栈开发day2
- oracle数据类型--数值类型
- 关闭页面那点事儿...
- 数据库 查询XML XQuery
- Android Studio 如何修改项目名称
- js ajax异步提交,jquery ajax异步提交表单数据的方法
- 人人网惨遭全网下架,但是我并不同情他!
- 儿童学写字.exe.CR.rar.eml
- 文本表示(一)—— word2vec(skip-gram CBOW) glove, transformer, BERT
- 品达通用权限系统(Day 1~Day 2)
- d3.js画金庸小说力导向图
- Windows常用快捷组合键整理Dos命令基础集合
- IOS (不越狱)网络抓包
- Gerrit快速安装手册
- 3天增粉10W+,这是活动的全程复盘
- autopilot_donkey car
- bs4 Beautiful Soup详解
- react实现聊天界面_使用react做的聊天对话列表
- L2-040 哲哲打游戏(模拟题)
- CREO工程图设计 2D出图 图纸设计视频教程