2016-01-16 74 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(); 
相關問題