终于我找到了问题的答案。
我通过互联网搜索和提问确实没有得到正确和最佳的答案。
这一切都与资源有关,投影中使用的外部所有内容都必须经过以下步骤:
- 导入/下载到项目文件夹。
(将文件作为投影子文件夹放入资源文件夹中是很常见的)
- 定义/提交/转换为本地或全局投影
.resx
file.
(.resx
文件是 XML)
- 从 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 ResourceManager
IDE 在基本表单类中创建的对象,因此您可以在设计器文件中轻松使用它。
例如,如果您想在 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 中没有任何资源引用