如何在C#中手动使用资源(没有IDE行为)?

时间:2015-08-22 15:41:08

标签: c# .net visual-studio

我正在使用visual studio学习C#,我想更深入一点。

我想了解如何手动使用项目资源?不是IDE。我搜索了网站,但我刚看到这个家伙How to create and use resources in .NET,但这不是我想要的。

我为自己定义了一个投影手动设置表单图标。

我试过了:

  1. 首先我添加了一个项目文件夹并将其重命名为Resources
  2. 然后我添加了.ico文件,并将其重命名为icon
  3. 然后我在Resources.Designer.cs这样定义了

        internal static System.Drawing.Icon icon {
        get {
            object obj = ResourceManager.GetObject("icon", resourceCulture);
            return ((System.Drawing.Icon)(obj));
        }
    }
    
  4. 我在表单设计器中添加了这样的图标:

    this.Icon = Properties.Resources.icon;
    
  5. 当我输入Properties.Resources.时,一切看起来都很好并且VS智能感知中的图标短语可用,但是在第一次执行尝试时图标没有设置

    在其他尝试中,我收到了此错误:

      

    类型' setting_icon_from_resources.Properties.Resources'没有名为' icon'的财产。   C:\ Users \ mehdi \ Documents \ Visual Studio 2012 \ Projects \ setting icon from resources \ setting icon from resources \ Form1.Designer.cs

    我做错了什么?

1 个答案:

答案 0 :(得分:-3)

最后我找到了我的问题的答案。 我真的没有从搜索互联网和提问时得到正确和最好的答案。

所有关于资源的内容,投影中使用的所有内容都必须经过以下步骤:

  1. 导入/下载到项目文件夹。
  2. (将文件作为投影子文件夹放在Resource文件夹中非常常见)

    1. 已定义/提交/转换为本地或全局投影的.resx文件。
    2. .resx文件是XML)

      1. 从C#.net获取句柄以便访问。
      2. (来自.resx设计师档案)

        (这是通过在全局或本地C#.net .resx设计师中定义 - 通常作为属性来完成的)

        如果我们假设本地.resx作为个人背包进行课程和投影(全球).resx文件作为公共抽屉,则每个课程都会从他们自己的背包和公共抽屉中提供资源。通过常规的直接提供资源的过程,Visual Studio IDE不会让类使用其他类资源。但是,如果你进一步了解.resx文件和设计师文件,这将是可能的。

        首先让我解释一下类如何使用其他类资源。

        将文件导入本地.resx导入.resx的XML文件的硬编码副本时。如果使用XML编辑器打开.resx文件,则可以访问本地.resx文件的XML。

        例如,如果您将图标文件导入表单 您将在XML中看到与图标相关的这些代码:

        (要在VS中访问XML编辑器,只需右键单击.resx文件,然后单击“打开”,然后选择“XML编辑器”)

        <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing"
         mimetype="application/x-microsoft.net.object.bytearray.base64">
        <value>
        AAABAAkAMDAAAAEACACoDgAAlgAAACAgAAABAAgAqAgAAEAPAAAYGAAAAQAIAMgGAAD
        oFwAAEBAAAAEACABoBQAAsB4AAAAAAAABACAA510BABgkAAAwMAAAAQAgAKglAAAAggEAICAA
        AAEAIACoEAAAqKcBABgYAAABACAAiAkAAFC4AQAQEAAAAQAgAGgEAADYwQEAKAAAADAAAABgAAA
        AAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAZHBQAHR4ZABgkFAAaKRYAHyAaAB0rGQ
        AeMBkAIiQcACQpHgAiNBwAJDkeACUn
        .
        .
        .
        +Pn5D/j5+Q/4+fkP+Pn5D/j5+Q/4+fkP+Pn5D/j5+Q/4+fk
        P+Pn5D/j5+Q/4+fkPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA4AMAAAABA
        AAAAAAAAAEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAA
        </value>
        </data>
        

        编码的文件,你可以看到VS给它一个名字($ this.Icon)并在那里指定它的类型和mimetype。所以这些财产现在是可以改变的

        要访问设计器或构造函数文件中的资源,必须创建System.Resources.ResourceManager的对象。 ResourceManager的构造函数有两个重载,其中一个只使用resourceSource类型作为输入参数。它必须是资源主机的资源类型。一个人可以这样得到:

        typeof(Form1) ;
        

        所以创建一个ResourceManager对象:

        System.Resources.ResourceManager resource = new System.Resources.ResourceManager(typeof(Form1))
        

        对象resource现在有一个GetObject()方法可以按名称访问.resx导入的文件,例如图标:

        ((System.Drawing.Icon)(resources.GetObject("$this.Icon")))
        

        如果您打开表单的设计器文件,则可以看到表单图标的代码:

        this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
        

        resource是IDE在基本表单类中创建的ResourceManager对象,因此您可以在设计器文件中轻松使用它。

        如果您想使用form2中form1的图标,可以像这样引用它:

        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(284, 262);
        **this.Icon = (System.Drawing.Icon)((new System.Resources.ResourceManager(typeof(Form1))).GetObject("$this.Icon"));***
        this.Name = "Form2";
        this.Text = "Form2";
        this.ResumeLayout(false);
        

        (仔细看看以**开头的行)

        也许最好将它定义为表单构造函数中的公共静态属性,以避免过多的嵌套类型:

        public static System.Drawing.Icon icon
        {
          get
          {
             return (System.Drawing.Icon)((new System.Resources.ResourceManager(typeof(Form1))).GetObject("$this.Icon"));
          }
        }
        

        所以在form2设计师:

        this.Icon = Form1.icon ;
        

        到目前为止,使用其他类的资源,现在让我们谈谈手动定义和使用全局预测资源!

        全局.resx文件中没有导入文件的硬拷贝。只是提到它。

        例如,您使用IDE导入了图标,它会创建一个Resource子文件夹并将文件放入其中。 现在,如果您在解决方案管理器中打开属性并使用XML编辑器打开Resource.resx(右键单击&gt;打开&gt; XML编辑器),您可以看到以下代码:

        <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <data name="PerfCenterCpl" type="System.Resources.ResXFileRef, System.Windows.Forms">
        <value>..\Resources\icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
        </data>
        

        你可以在上面的值中看到它指定了它的引用地址及其类型甚至它的类型版本!和它的文化类型,真的很有趣,它有一把钥匙!

        从它的地址,似乎文件刚刚添加到投影的完整性。全局资源可以是投影文件夹,计算机,网络或互联网中的每个位置!

        它有一个独特的钥匙!看来我们也可以通过项目中的密钥访问资源了!

        现在是资源得到处理的时候了 如果您在解决方案管理器中打开Resource.resx并打开资源设计器,您可以看到它由属性获取它的句柄:

               internal static System.Drawing.Icon icon {
                get {
                    object obj = ResourceManager.GetObject("icon", resourceCulture);
                    return ((System.Drawing.Icon)(obj));
                }
               }
        

        因此可以使用Properties.Resources.icon访问资源 并且不需要任何类型的铸造:

        this.Icon = Properties.Resources.icon ;
        

        现在如果需要对资源进行进一步处理,全局资源可以是接受输入参数的方法!

        在我的问题中,我给资源一个句柄,但XML中没有任何资源引用