我正在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 intellisense中可用,但是在第一次执行尝试时,图标未设置
在其他尝试中,我收到此错误:
类型“ setting_icon_from_resources.Properties.Resources”没有名为“ icon”的属性。C:\ Users \ mehdi \ Documents \ Visual Studio 2012 \ Projects \资源中的设置图标\资源\ Form1.Designer.cs中的设置图标
我究竟做错了什么 ?
终于我找到了我问题的答案。我确实没有从网上搜索和提问中得到正确和最佳的答案。
涉及资源,投影中使用的所有外部资源都必须经过以下步骤:
(将文件作为投影子文件夹放置到Resource文件夹中确实很常见)
.resx
文件。(.resx
文件是XML)
(来自.resx
设计器文件)
(这是通过在全局或本地C#.net.resx
设计器中定义-通常作为属性来完成的)
如果我们假设local.resx
作为班级的私人背包,并且将projection(global).resx
文件用作公共抽屉,则每个班级都从自己的背包和公共抽屉中提供资源。通过传统的直接提供资源的程序,Visual Studio IDE不允许类使用其他类的资源。但是,如果您进一步深入研究.resx
文件和设计器文件,这将是可能的。
首先,让我解释一下一个类如何使用其他类的资源。
当您将文件导入本地时,将文件.resx
的硬编码副本导入到的XML中.resx
。.resx
如果.resx
使用XML-editor打开文件,则可以访问本地文件的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
type作为输入参数。它必须是资源宿主的资源类型。一个人可以这样得到:
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
是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编辑器(右键单击>“打开方式”>“ XML编辑器”)打开Resource.resx,则可以看到以下代码:
<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>
您可以在上面的值中看到它指定的参考地址,类型,甚至是类型版本!而且它的文化类型和真正有趣的地方都有一把钥匙!
从它的地址看,似乎为了完整性刚刚添加了文件。全局资源可以在投影文件夹,计算机,网络或Internet中的任何位置!
它有一个独特的钥匙!看来我们也可以通过他们在项目中的键来访问资源!
现在,如果您在解决方案管理器中打开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中没有任何资源引用
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句