如何将资源中的所有图像作为列表?
我有一个WinForms项目并向资源添加了多个图像(项目属性 – >资源)。 现在我有一个Form1.cs,一个带有.resx文件的UserControl1.cs,并使用Assembly.GetManifestResourceNames()
,它包含3个字符串,即:
1 TestApplication1.Properties.Resources.resources, 2 TestApplication1.Form1.resources 3 TestApplication1.UserControl1.resources
我现在需要得到的是#1中的文件,其中包含我需要获取的图像。 我需要做的是有一个列表,我可以通过它们的索引访问这些图像。 我可以单独访问这些文件没有问题,但我有72张图片所以我需要它们作为列表。 所以我的问题是,如何将#1中的这些图像作为列表?
编辑:没有其他方法可以创建一个列表并将所有72个图像添加到其中吗? 或者有什么方法可以从资源中获取所有这些图像作为列表? 此外,我不想使用System.IO
因为我将此应用程序构建为类库。
每个.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; }
要获取resx
文件中的所有图像,您可以使用以下任一选项:
ResourceManager.GetResourceSet
基于Dai的答案,您可以使用ResourceManager.GetResourceSet
,然后以这种方式过滤和整形结果:
var images = Properties.Resources.ResourceManager .GetResourceSet(CultureInfo.CurrentCulture, true, true) .Cast() .Where(x => x.Value.GetType() == typeof(Bitmap)) .Select(x => new { Name = x.Key.ToString(), Image = x.Value }) .ToList();
reflection
另外,作为另一种选择,您可以使用对资源类型的reflection,并以这种方式查找属性并对结果进行整形:
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();