如何在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 intellisense中可用,但是在第一次执行尝试时,图标未设置

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

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

我究竟做错了什么 ?

梅迪

终于我找到了我问题的答案。我确实没有从网上搜索和提问中得到正确和最佳的答案。

涉及资源,投影中使用的所有外部资源都必须经过以下步骤:

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

(将文件作为投影子文件夹放置到Resource文件夹中确实很常见)

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

.resx文件是XML)

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

(来自.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具有两个重载,其中之一仅使用resourceSourcetype作为输入参数。它必须是资源宿主的资源类型。一个人可以这样得到:

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")));

resourceResourceManager由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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C#中手动使用PKCS5(RFC 1423)填充进行AES解密?

来自分类Dev

如何在C中手动迭代堆栈帧?

来自分类Dev

如何在Visual C ++中手动处理名称?

来自分类Dev

如何在不手动在SQL中手动键入列名的情况下透视表

来自分类Dev

如何手动执行对UITextField编辑的操作(使用rx观察到的更改)?

来自分类Dev

如何在Api-Platform中手动将资源序列化到Json?

来自分类Dev

如何在不手动列出查询中的所有值的情况下使用 SQL 创建分发表?

来自分类Dev

如何使用OpenACC在C中执行结构的2D动态数组的手动深度复制

来自分类Dev

如何在Parsec中手动操作特殊表达式的优先级?

来自分类Dev

如何在Web Api中手动执行Breeze筛选器?

来自分类Dev

如何在Web Api中手动执行Breeze筛选器?

来自分类Dev

如何在Vuex操作中使用手动路由?

来自分类Dev

几个C#项目如何在没有繁琐的手动复制的情况下使用非托管DLL?

来自分类Dev

如何在不使用C#手动更新ID的情况下将依赖LINQ插入SQL实体?

来自分类Dev

为什么此循环不执行我可以手动执行的操作?

来自分类Dev

JavaFX 8:如果用户手动调整列大小,则TableColumn setPrefWidth不执行任何操作

来自分类Dev

C#,如何手动设置光标位置

来自分类Dev

在C#中手动拆分字符串

来自分类Dev

在C#中手动控制内存分配

来自分类Dev

在C#中手动设置线程退出代码?

来自分类Dev

如何在SSRS中手动删除订阅?

来自分类Dev

如何在MVC 6中手动验证模型

来自分类Dev

如何在PySide中手动触发aboutToQuit信号

来自分类Dev

如何在Android Studio中手动运行Proguard?

来自分类Dev

如何在ReactJS中手动设置输入值?

来自分类Dev

如何在Python中手动创建稀疏矩阵

来自分类Dev

如何在自制软件中手动安装zenity?

来自分类Dev

如何在Magento中手动更新库存数量

来自分类Dev

如何在iOS钥匙串中手动存储?

Related 相关文章

  1. 1

    如何在C#中手动使用PKCS5(RFC 1423)填充进行AES解密?

  2. 2

    如何在C中手动迭代堆栈帧?

  3. 3

    如何在Visual C ++中手动处理名称?

  4. 4

    如何在不手动在SQL中手动键入列名的情况下透视表

  5. 5

    如何手动执行对UITextField编辑的操作(使用rx观察到的更改)?

  6. 6

    如何在Api-Platform中手动将资源序列化到Json?

  7. 7

    如何在不手动列出查询中的所有值的情况下使用 SQL 创建分发表?

  8. 8

    如何使用OpenACC在C中执行结构的2D动态数组的手动深度复制

  9. 9

    如何在Parsec中手动操作特殊表达式的优先级?

  10. 10

    如何在Web Api中手动执行Breeze筛选器?

  11. 11

    如何在Web Api中手动执行Breeze筛选器?

  12. 12

    如何在Vuex操作中使用手动路由?

  13. 13

    几个C#项目如何在没有繁琐的手动复制的情况下使用非托管DLL?

  14. 14

    如何在不使用C#手动更新ID的情况下将依赖LINQ插入SQL实体?

  15. 15

    为什么此循环不执行我可以手动执行的操作?

  16. 16

    JavaFX 8:如果用户手动调整列大小,则TableColumn setPrefWidth不执行任何操作

  17. 17

    C#,如何手动设置光标位置

  18. 18

    在C#中手动拆分字符串

  19. 19

    在C#中手动控制内存分配

  20. 20

    在C#中手动设置线程退出代码?

  21. 21

    如何在SSRS中手动删除订阅?

  22. 22

    如何在MVC 6中手动验证模型

  23. 23

    如何在PySide中手动触发aboutToQuit信号

  24. 24

    如何在Android Studio中手动运行Proguard?

  25. 25

    如何在ReactJS中手动设置输入值?

  26. 26

    如何在Python中手动创建稀疏矩阵

  27. 27

    如何在自制软件中手动安装zenity?

  28. 28

    如何在Magento中手动更新库存数量

  29. 29

    如何在iOS钥匙串中手动存储?

热门标签

归档