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

2024-02-01

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

我想知道如何手动使用项目资源?不是通过 IDE。我搜索了该网站,但我刚刚看到这个家伙的帖子如何在.NET中创建和使用资源 https://stackoverflow.com/questions/90697/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;
    

一切看起来都很好,当我输入时,图标短语在 VS 智能感知中可用Properties.Resources.,但第一次执行尝试时图标未设置

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

类型“setting_icon_from_resources.Properties.Resources”没有名为“icon”的属性。 C:\Users\mehdi\Documents\Visual Studio 2012\Projects\资源中的设置图标\资源中的设置图标\Form1.Designer.cs

我究竟做错了什么 ?


终于我找到了问题的答案。 我通过互联网搜索和提问确实没有得到正确和最佳的答案。

这一切都与资源有关,投影中使用的外部所有内容都必须经过以下步骤:

  1. 导入/下载到项目文件夹。

(将文件作为投影子文件夹放入资源文件夹中是很常见的)

  1. 定义/提交/转换为本地或全局投影.resx file.

(.resx文件是 XML)

  1. 从 C#.net 获取句柄以进行访问。

(from .resx设计师文件)

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

如果我们假设本地.resx作为课堂和投影的个人背包(全球).resx文件作为一个公共抽屉,每个班级都从自己的背包和公共抽屉中提供自己的资源。通过传统的直接提供资源的过程,Visual Studio IDE 不允许类使用其他类资源。但如果你再深入一点.resx文件和设计器文件这将是可能的。

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

当您将文件导入本地时.resx导入到 XML 中的文件的硬编码副本.resx。您可以访问本地的 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 is a ResourceManagerIDE 在基本表单类中创建的对象,因此您可以在设计器文件中轻松使用它。

例如,如果您想在 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(右键单击 > 打开方式 > 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 中没有任何资源引用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在C#中手动使用资源(无IDE行为)? 的相关文章

随机推荐