2016-01-16 76 views
1

我有一个WinForms项目,并将多个图像添加到资源(项目属性 - >资源)。现在我有一个Form1.cs中,用的.resx文件UserControl1.cs,并使用Assembly.GetManifestResourceNames(),它包含3串即:如何获取资源列表中的所有图像?

TestApplication1.Properties.Resources.resources, TestApplication1.Form1的.resources TestApplication1.UserControl1.resources

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

编辑: 有没有其他的方式来创建一个列表并将我的72个图像添加到它?或者有什么方法可以将这些图像从资源中作为列表获取?另外,我不想诉诸于使用System.IO,因为我会将此应用程序构建为类库。

+0

如何访问单个图像? – Shaharyar

+0

我的意思是使用'Resources.Image1','Resources.Image2'等等,但是我无法为我的72张图片做到这一点,所以我要求一种将图像作为列表的方式。 –

回答

3

将每个.resx文件编译为位于程序集中的单个“复合”嵌入式*.resources资源块。我很欣赏这是令人困惑的,因为它意味着术语“资源”被超载,指的是.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; 
} 
+0

不幸的是,编译器抛出一个错误“System.Resources.ResourceSet.Table”由于其保护级别而无法访问 –

+0

@EricJohnIgnacio我修改了我的答案,使用'ResourceSet'的内置'IEnumerable'实现来获得'DictionaryEntry'值。 – Dai

+0

'GetResourceSet'有3个参数,你没有在你的代码中提供它们。我用'var resources = Resources.ResourceManager.GetResourceSet(CultureInfo.CurrentCulture,false,true);'和资源返回null。 –

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(); 
相关问题