如何在C#中手动使用资源(没有IDE行为)?
我正在使用visual studio学习C#,我想更深入一点。
我想知道如何手动使用项目资源? 不是IDE。 我搜索了网站,但我刚看到这个家伙发布如何在.NET中创建和使用资源,但这不是我想要的。
我为自己定义了一个投影手动设置表单图标。
我试过这个:
- 首先,我添加了一个项目文件夹,并将其重命名为
Resources
- 然后我添加了一个
.ico
文件并将其重命名为icon
-
然后我在
Resources.Designer.cs
定义了它internal static System.Drawing.Icon icon { get { object obj = ResourceManager.GetObject("icon", resourceCulture); return ((System.Drawing.Icon)(obj)); } }
-
我在表单设计器中添加了这样的图标:
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图标
我究竟做错了什么 ?
最后我找到了我的问题的答案。 我真的没有从搜索互联网和提问时得到正确和最好的答案。
一切都与资源有关,投影中使用的所有内容都必须经过以下步骤:
- 导入/下载到项目文件夹。
(将文件作为投影子文件夹放在Resource文件夹中非常常见)
- 已定义/已提交/转换为本地或全局投影的
.resx
文件。
( .resx
文件是XML)
- 从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中没有任何资源引用