如何将资源中的所有图像作为列表获取

本文关键字:图像 列表 获取 资源 | 更新日期: 2023-09-27 18:30:46

我有一个WinForms项目,并向资源中添加了多个图像(项目属性->资源)。现在我有一个 Form1.cs,一个带有 .resx 文件的 UserControl1.cs,并使用 Assembly.GetManifestResourceNames() ,它包含 3 个字符串,即:

1

测试应用程序1.属性.资源.资源,2 测试应用程序1.表单1.资源3 测试应用程序1.用户控制1.资源

我现在需要得到的显然是来自#1的文件,其中包含我需要获取的图像。我需要做的是有一个列表,我可以通过它们的索引访问这些图像。我可以毫无问题地单独访问此文件,但我有 72 张图像,所以我需要它们作为列表。所以我的问题是,如何在 #1 中获取这些图像作为列表?

编辑:没有其他方法可以创建一个列表并将我的所有 72 张图像添加到其中吗?或者有没有办法从资源中获取所有这些图像作为列表?另外,我不想求助于使用System.IO因为我将把这个应用程序构建为类库。

如何将资源中的所有图像作为列表获取

若要获取resx文件中的所有图像,可以使用以下任一选项:

ResourceManager.GetResourceSet

根据 Dai 的回答,您可以使用ResourceManager.GetResourceSet然后按以下方式过滤和塑造结果:

var images = Properties.Resources.ResourceManager
                       .GetResourceSet(CultureInfo.CurrentCulture, true, true)
                       .Cast<DictionaryEntry>()
                       .Where(x => x.Value.GetType() == typeof(Bitmap))
                       .Select(x => new { Name = x.Key.ToString(), Image = x.Value })
                       .ToList();

反射

此外,作为另一个选项,您可以使用对资源类型的反射,并查找属性并通过以下方式塑造结果:

var images = typeof(Properties.Resources)
               .GetProperties(BindingFlags.Static | BindingFlags.NonPublic |
                                                    BindingFlags.Public)
               .Where(p => p.PropertyType == typeof(Bitmap))
               .Select(x => new { Name = x.Name, Image = x.GetValue(null, null) })
               .ToList();

每个.resx文件都编译为嵌入*.resources位于程序集中的单个"复合"资源 blob。我很理解这令人困惑,因为这意味着术语"资源"被重载,既指.resources blob,也指每个 blob 的各个内容。

使用 ResourceManager 类从.resources文件中检索命名项。

请注意,如果您在Visual Studio中使用.resx设计器,则无需直接使用ResourceManager,只需使用生成的Resources类,如下所示:

using MyProject.Properties;
...
this.label1.Text = Resources.SomeLabelText;

(其中SomeLabelText是键名称)

默认情况下,设计器生成的 Resources 类将位于 Properties 子命名空间下。

要枚举资源,您需要使用 ResourceManager ,如下所示:

ResourceSet rsrcSet = MyProject.Properties.Resources.ResourceManager.GetResourceSet( CultureInfo.CurrentCulture, false, true );
foreach( DictionaryEntry entry in rsrcSet ) {
    String name = entry.Key;
    Object resource = entry.Value;
}