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

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

我想知道如何手动使用项目资源? 不是IDE。 我搜索了网站,但我刚看到这个家伙发布如何在.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; 

一切似乎都很好,当我键入Properties.Resources.时,VS智能感知中的图标短语可用Properties.Resources. ,但在第一次执行尝试时,图标没有设置

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

类型’setting_icon_from_resources.Properties.Resources’没有名为’icon’的属性。 来自resources \ Form1.Designer.cs的resources \ setting图标中的C:\ Users \ mehdi \ Documents \ Visual Studio 2012 \ Projects \ setting图标

我究竟做错了什么 ?

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

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

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

(将文件作为投影子文件夹放在Resource文件夹中非常常见)

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

.resx文件是XML)

  1. 从C#.net获取句柄是可访问的。

(来自.resx设计师档案)

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

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

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

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

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

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

   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   

编码的文件,你可以看到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(右键单击>打开方式> XML编辑器),您可以看到以下代码:

   ..\Resources\icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a  

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

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

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

现在,如果您在解决方案管理器中打开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中没有任何资源引用