可以在VS设计视图下加载出XML多语言配置文件的多语言控件
闲着没事写点东西,可用于WINFORM适当修改下可用在WEB下的多语言控件,在VS设计视图下可自动加载出xml中所配置的语言节点。
1
public class LanguageText : Label, IPropertyGridable
2
{
3
public enum LanguageType
4
{
5
CN=0,
6
EN=1,
7
}
8
XmlDocument doc = new XmlDocument();
9
string nodeValue;
10
string xml;
11
/// <summary>
12
/// XML内容
13
/// </summary>
14
private string XMLString
15
{
16
get
17
{
18
if (Language == LanguageType.CN)
19
{
20
if (CnLanguageXmlFile != null && CnLanguageXmlFile != string.Empty)
21
{
22
doc.Load(CnLanguageXmlFile);
23
}
24
}
25
else
26
{
27
if (EnLanguageXmlFile != null && EnLanguageXmlFile != string.Empty)
28
{
29
doc.Load(EnLanguageXmlFile);
30
}
31
}
32
return doc.InnerXml==string.Empty?xml:doc.InnerXml;
33
}
34
set
35
{
36
xml = value;
37
}
38
}
39
/// <summary>
40
///
41
/// </summary>
42
[Category("Language")]
43
public string NodeValue
44
{
45
get { return nodeValue; }
46
set { nodeValue = value; Text = value; }
47
}
48
string nodeName = "ProductName";
49
/// <summary>
50
/// XML文件中节点列表,绑定LangugeXMLConverter实现VS属性窗口节点选择
51
/// </summary>
52
[Category("Language"), TypeConverter(typeof(LangugeXMLConverter))]
53
public string NodeName
54
{
55
get { return nodeName; }
56
set { nodeName = value; NodeNameChange(value); }
57
}
58
public LanguageText()
59
{
60
NodeNameChange(NodeName);
61
}
62
public override string Text
63
{
64
get
65
{
66
return NodeValue;
67
}
68
set { base.Text = value; }
69
}
70
/// <summary>
71
/// 改变节点时并改变相应的值
72
/// </summary>
73
/// <param name="name"></param>
74
public void NodeNameChange(string name)
75
{
76
nodeName = name;
77
if (XMLString!=null&&XMLString != string.Empty)
78
{
79
doc.LoadXml(XMLString);
80
if (doc.GetElementsByTagName(NodeName).Count > 0)
81
{
82
NodeValue = doc.GetElementsByTagName(NodeName).Item(0).FirstChild.Value;
83
}
84
}
85
}
86
/// <summary>
87
/// 获取XML中的配置节点
88
/// </summary>
89
/// <returns></returns>
90
public string[] GetNodes()
91
{
92
if (XMLString == null || XMLString == string.Empty)
93
{
94
return new string[]{"加载XML失败"};
95
}
96
doc.LoadXml(XMLString);
97
XmlNodeList nodes = (doc.DocumentElement).ChildNodes;
98
List<string> lst = new List<string>();
99
foreach (XmlNode item in nodes)
100
{
101
lst.Add(item.Name);
102
}
103
return lst.ToArray();
104
}
105
106
string enLanguageXmlFile = "";
107
/// <summary>
108
/// 英文XML配置文件
109
/// </summary>
110
[Category("Language"),EditorAttribute(typeof(OpenFileDialogEditor), typeof(System.Drawing.Design.UITypeEditor))]
111
public string EnLanguageXmlFile
112
{
113
get { return enLanguageXmlFile; }
114
set { enLanguageXmlFile = value; }
115
}
116
string cnLanguageXmlFile = "";
117
/// <summary>
118
/// 中文XML配置文件
119
/// </summary>
120
[Category("Language"),EditorAttribute(typeof(OpenFileDialogEditor), typeof(System.Drawing.Design.UITypeEditor))]
121
public string CnLanguageXmlFile
122
{
123
get { return cnLanguageXmlFile; }
124
set { cnLanguageXmlFile = value; }
125
}
126
LanguageType language;
127
/// <summary>
128
/// 语言类型
129
/// </summary>
130
[Category("Language")]
131
public LanguageType Language
132
{
133
get { return language; }
134
set { language = value; NodeNameChange(NodeName); }
135
}
136
137
}
138
public class OpenFileDialogEditor : System.Drawing.Design.UITypeEditor
139
{
140
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
141
{
142
OpenFileDialog fileD = new OpenFileDialog();
143
fileD.CheckFileExists = true;
144
fileD.CheckPathExists = true;
145
if (fileD.ShowDialog() == DialogResult.OK)
146
{
147
return fileD.FileName;
148
}
149
return "";
150
}
151
public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
152
{
153
return System.Drawing.Design.UITypeEditorEditStyle.Modal;
154
}
155
}
156
public interface IPropertyGridable
157
{
158
string[] GetNodes();
159
}
160
/// <summary>
161
/// 将XML数据转换成字符串数组。实现VS中属性窗口视图化
162
/// </summary>
163
public class LangugeXMLConverter : TypeConverter
164
{
165
public override bool GetStandardValuesSupported(
166
ITypeDescriptorContext context)
167
{
168
return true;
169
}
170
public override bool GetStandardValuesExclusive(
171
ITypeDescriptorContext context)
172
{
173
return false;
174
}
175
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
176
{
177
IPropertyGridable instance = (IPropertyGridable)context.Instance;
178
StandardValuesCollection vals = new TypeConverter.StandardValuesCollection(instance.GetNodes());
179
return vals;
180
}
181
public override bool IsValid(ITypeDescriptorContext context, object value)
182
{
183
return false;
184
}
185
}
public class LanguageText : Label, IPropertyGridable2
{3
public enum LanguageType4
{ 5
CN=0,6
EN=1,7
}8
XmlDocument doc = new XmlDocument();9
string nodeValue;10
string xml;11
/// <summary>12
/// XML内容13
/// </summary>14
private string XMLString15
{16
get17
{18
if (Language == LanguageType.CN)19
{20
if (CnLanguageXmlFile != null && CnLanguageXmlFile != string.Empty)21
{22
doc.Load(CnLanguageXmlFile);23
}24
}25
else26
{27
if (EnLanguageXmlFile != null && EnLanguageXmlFile != string.Empty)28
{29
doc.Load(EnLanguageXmlFile);30
}31
}32
return doc.InnerXml==string.Empty?xml:doc.InnerXml;33
}34
set35
{36
xml = value;37
}38
}39
/// <summary>40
/// 41
/// </summary>42
[Category("Language")]43
public string NodeValue44
{45
get { return nodeValue; }46
set { nodeValue = value; Text = value; }47
}48
string nodeName = "ProductName";49
/// <summary>50
/// XML文件中节点列表,绑定LangugeXMLConverter实现VS属性窗口节点选择51
/// </summary>52
[Category("Language"), TypeConverter(typeof(LangugeXMLConverter))] 53
public string NodeName54
{55
get { return nodeName; }56
set { nodeName = value; NodeNameChange(value); }57
}58
public LanguageText()59
{60
NodeNameChange(NodeName);61
}62
public override string Text63
{64
get65
{66
return NodeValue;67
}68
set { base.Text = value; }69
}70
/// <summary>71
/// 改变节点时并改变相应的值72
/// </summary>73
/// <param name="name"></param>74
public void NodeNameChange(string name)75
{76
nodeName = name;77
if (XMLString!=null&&XMLString != string.Empty)78
{79
doc.LoadXml(XMLString);80
if (doc.GetElementsByTagName(NodeName).Count > 0)81
{82
NodeValue = doc.GetElementsByTagName(NodeName).Item(0).FirstChild.Value;83
}84
}85
}86
/// <summary>87
/// 获取XML中的配置节点88
/// </summary>89
/// <returns></returns>90
public string[] GetNodes()91
{92
if (XMLString == null || XMLString == string.Empty)93
{ 94
return new string[]{"加载XML失败"};95
}96
doc.LoadXml(XMLString);97
XmlNodeList nodes = (doc.DocumentElement).ChildNodes;98
List<string> lst = new List<string>();99
foreach (XmlNode item in nodes)100
{101
lst.Add(item.Name);102
}103
return lst.ToArray();104
}105
106
string enLanguageXmlFile = "";107
/// <summary>108
/// 英文XML配置文件109
/// </summary>110
[Category("Language"),EditorAttribute(typeof(OpenFileDialogEditor), typeof(System.Drawing.Design.UITypeEditor))]111
public string EnLanguageXmlFile112
{113
get { return enLanguageXmlFile; }114
set { enLanguageXmlFile = value; }115
}116
string cnLanguageXmlFile = "";117
/// <summary>118
/// 中文XML配置文件119
/// </summary>120
[Category("Language"),EditorAttribute(typeof(OpenFileDialogEditor), typeof(System.Drawing.Design.UITypeEditor))]121
public string CnLanguageXmlFile122
{123
get { return cnLanguageXmlFile; }124
set { cnLanguageXmlFile = value; }125
}126
LanguageType language;127
/// <summary>128
/// 语言类型129
/// </summary>130
[Category("Language")]131
public LanguageType Language132
{133
get { return language; }134
set { language = value; NodeNameChange(NodeName); }135
}136
137
}138
public class OpenFileDialogEditor : System.Drawing.Design.UITypeEditor139
{140
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)141
{142
OpenFileDialog fileD = new OpenFileDialog();143
fileD.CheckFileExists = true;144
fileD.CheckPathExists = true;145
if (fileD.ShowDialog() == DialogResult.OK)146
{147
return fileD.FileName;148
}149
return "";150
}151
public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)152
{153
return System.Drawing.Design.UITypeEditorEditStyle.Modal;154
}155
}156
public interface IPropertyGridable157
{158
string[] GetNodes();159
}160
/// <summary>161
/// 将XML数据转换成字符串数组。实现VS中属性窗口视图化162
/// </summary>163
public class LangugeXMLConverter : TypeConverter164
{165
public override bool GetStandardValuesSupported(166
ITypeDescriptorContext context)167
{168
return true;169
}170
public override bool GetStandardValuesExclusive(171
ITypeDescriptorContext context)172
{173
return false;174
}175
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)176
{177
IPropertyGridable instance = (IPropertyGridable)context.Instance;178
StandardValuesCollection vals = new TypeConverter.StandardValuesCollection(instance.GetNodes());179
return vals;180
}181
public override bool IsValid(ITypeDescriptorContext context, object value)182
{183
return false;184
}185
} 

浙公网安备 33010602011771号