如何将资源中的所有图像作为列表获取
本文关键字:图像 列表 获取 资源 | 更新日期: 2023-09-27 18:30:46
我有一个WinForms项目,并向资源中添加了多个图像(项目属性->资源)。现在我有一个 Form1.cs,一个带有 .resx 文件的 UserControl1.cs,并使用 Assembly.GetManifestResourceNames()
,它包含 3 个字符串,即:
测试应用程序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;
}