当前位置:编程学习 > C#/ASP.NET >>

关于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”文字,所以还显示“我是按钮”。

问题基本上就是这样。。 --------------------编程问答-------------------- 好像还漏贴了切换语言的方法


        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
--------------------编程问答-------------------- http://www.cnblogs.com/hongtao/archive/2010/10/21/1857714.html --------------------编程问答--------------------
引用 5 楼 fengyarongaa 的回复:
http://www.cnblogs.com/hongtao/archive/2010/10/21/1857714.html


这个好像跟我的问题没啥关系啊...
我的问题是在继承关系下,基类画面控件的文字无法切换语言。 --------------------编程问答-------------------- 我只想问LZ一句,既然你已经知道了基类和子类的关系,那么子类难道真得不能去读基类的

而且你代码不已经写得很明确了??

Public Shared Sub SetFormLanguage(ByRef frm As UI.Form.BaseForm)

Dim res As ComponentResourceManager = New ComponentResourceManager(frm.GetType)

问题就出在这个frm,如果是子类的,全部想办法传基类的.可懂??? --------------------编程问答-------------------- = =!
错了,错了,偶错了,太粗心了...
而且题目的意思也看错了,我再想想... --------------------编程问答--------------------
引用 8 楼 fage_1982 的回复:
= =!
错了,错了,偶错了,太粗心了...
而且题目的意思也看错了,我再想想...


我也想..怎么按你的话来写呢...
刚想请教写法的,呵呵 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 额。。又出现问题了。。
本来“在继承的子画面资源文件中,手动添加基类控件的文字”能解决问题
但发现,编译运行几次以后,IDE会自动将这些属性从资源文件中删除。。
于是,现在问题没法解决了。。 --------------------编程问答-------------------- 想到个挺纠结的解决办法:
画面继承下来以后,把集成控件的文字全部改掉,a,b,c啊什么的都行,
然后切换2种语言分别设置相应文字。。
这样就会出来3个资源文件。。。
补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,