关于WinForm的资源文件
最近做个项目要双语言,用切换资源文件来实现。但是出现了比较奇怪的问题,就是如果画面是继承基类的,
那么基类画面上设置的控件文字,不会出现在子类的resx文件中。
于是这就导致了,切换语言之后,再切换回来,找不到的控件文字,无法切换回来。。
后来的解决方法是在继承的子画面资源文件中,手动添加基类控件的文字。
效果是对了,但这样做,基类的存在就有点鸡肋了。。
请问有别的方法解决么?比如基类的控件文字,在继承后能自动出现在资源文件中什么的。。
--------------------编程问答-------------------- 弄段代码上来.描述抽象 --------------------编程问答-------------------- 代码啊。。好像不是很好贴,我弄下看看 --------------------编程问答-------------------- 这个是基类画面
这个是子类画面
把子类画面语言设置为简体中文,并修改按钮文字
修改后的资源文件Form2.zh-CN.resx
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Button1.Text" xml:space="preserve">
<value>我是按钮</value>
</data>
</root>
里面有按钮文字
而改语言之前的默认资源文件Form2.resx
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name=">>$this.Type" xml:space="preserve">
<value>WindowsApplication1.Form1, WindowsApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>292, 266</value>
</data>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 12</value>
</data>
<data name=">>Button1.Name" xml:space="preserve">
<value>Button1</value>
</data>
<data name=">>Button1.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>Button1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name=">>Button1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name=">>$this.Name" xml:space="preserve">
<value>Form2</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>子类画面</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>zh-CN</value>
</metadata>
</root>
没有按钮的文字属性
所以在运行时,画面从英文切换至中文后,按钮文字变成了“我是按钮”,
而再切换回英文的时候,因为资源文件中没有“I am Button”文字,所以还显示“我是按钮”。
问题基本上就是这样。。 --------------------编程问答-------------------- 好像还漏贴了切换语言的方法
--------------------编程问答-------------------- http://www.cnblogs.com/hongtao/archive/2010/10/21/1857714.html --------------------编程问答--------------------
Public Shared Sub SetFormLanguage(ByRef frm As UI.Form.BaseForm)
Dim culture As CultureInfo = CultureInfo.GetCultureInfo("zh-CN")
Thread.CurrentThread.CurrentCulture = culture
Thread.CurrentThread.CurrentUICulture = culture
Dim res As ComponentResourceManager = New ComponentResourceManager(frm.GetType)
res.ApplyResources(frm, "$this")
ApplyResouce(frm, res)
End Sub
Private Shared Sub ApplyResouce(ByVal control As Control, ByVal res As ComponentResourceManager)
For Each c As Control In control.Controls
res.ApplyResources(c, c.Name)
ApplyResouce(c, res)
Next
End Sub
这个好像跟我的问题没啥关系啊...
我的问题是在继承关系下,基类画面控件的文字无法切换语言。 --------------------编程问答-------------------- 我只想问LZ一句,既然你已经知道了基类和子类的关系,那么子类难道真得不能去读基类的
而且你代码不已经写得很明确了??
Public Shared Sub SetFormLanguage(ByRef frm As UI.Form.BaseForm)
Dim res As ComponentResourceManager = New ComponentResourceManager(frm.GetType)
问题就出在这个frm,如果是子类的,全部想办法传基类的.可懂??? --------------------编程问答-------------------- = =!
错了,错了,偶错了,太粗心了...
而且题目的意思也看错了,我再想想... --------------------编程问答--------------------
我也想..怎么按你的话来写呢...
刚想请教写法的,呵呵 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 额。。又出现问题了。。
本来“在继承的子画面资源文件中,手动添加基类控件的文字”能解决问题
但发现,编译运行几次以后,IDE会自动将这些属性从资源文件中删除。。
于是,现在问题没法解决了。。 --------------------编程问答-------------------- 想到个挺纠结的解决办法:
画面继承下来以后,把集成控件的文字全部改掉,a,b,c啊什么的都行,
然后切换2种语言分别设置相应文字。。
这样就会出来3个资源文件。。。
补充:.NET技术 , VB.NET