2016-01-16 4 views
1

У меня есть проект WinForms и добавлено несколько изображений в ресурсы (свойства проекта -> Ресурсы). Теперь у меня есть Form1.cs, UserControl1.cs с .resx файлов, и с помощью Assembly.GetManifestResourceNames(), он содержит 3 строки, а именно:Как получить все изображения в списке ресурсов?

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

Что мне нужно, чтобы получить сейчас, очевидно, файлы из # 1, который содержит изображения, которые мне нужно получить. Мне нужно сделать список, в котором я могу получить доступ к этим изображениям через свои индексы. Я могу получить доступ к этим файлам индивидуально без проблем, но у меня есть 72 изображения, поэтому я нуждаюсь в них в качестве списка. Поэтому мой вопрос: как получить эти изображения в # 1 как список?

EDIT: Нет ли другого способа создать список и добавить к нему все мои 72 изображения? Или есть способ, которым я могу получить все эти изображения из ресурсов в виде списка? Кроме того, я не хочу прибегать к использованию System.IO, поскольку я создам это приложение как библиотеку классов.

+0

Как получить доступ к одному изображению? – Shaharyar

+0

Я имею в виду использование 'Resources.Image1',' Resources.Image2' и т. Д., Но я не могу сделать это для своих 72 изображений, поэтому я прошу указать способ отображения изображений в виде списка. –

ответ

3

Каждый файл .resx скомпилирован в единый «составной» встроенный ресурс blob, который находится в вашей сборке. Я признаю, что это запутывает, так как это означает, что термин «ресурс» перегружен, чтобы ссылаться как на кадр .resources, так и на индивидуальное содержимое каждого блоба.

Используйте класс ResourceManager для извлечения именованных элементов из файла .resources.

Обратите внимание, что если вы используете .resx дизайнер в Visual Studio, то вам не нужно использовать 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. Я пересмотрел свой ответ, чтобы использовать встроенную реализацию '' IEnumerable' 'ResourceSet', чтобы получить' 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(); 
Смежные вопросы