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

时间:2016-01-16 10:54:18

标签: c# winforms

我有一个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,因为我将此应用程序构建为类库。

2 个答案:

答案 0 :(得分:2)

每个.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;
}

答案 1 :(得分:2)

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

<强> ResourceManager.GetResourceSet

基于Dai's answer,您可以使用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();