2009-06-16 3 views
4

В проекте Visual Basic я добавил файл ресурсов (resx), содержащий кучу изображений.Как получить имена всех ресурсов в файле ресурсов

Теперь я хочу запросить имена изображений. Если я открываю файл resx в представлении конструктора в среде Visual Studio IDE и выбираю изображение, то сетка свойств показывает мне свойство имени (по умолчанию «имя файла без расширения, но может быть изменено»).

Фон состоит в том, что У меня есть imagelist, который создается во время выполнения и заполняется изображениями из файла ресурсов. Чтобы иметь доступ к этим изображениям с помощью ключа, я должен его установить.

Мой код выглядит так (все жестко закодировано) :

Dim imagelist as new Imagelist 
imageList.Images.Add("A", My.Resources.MyImages.A) 
imageList.Images.Add("B", My.Resources.MyImages.B) 
imageList.Images.Add("C", My.Resources.MyImages.C) 
imageList.Images.Add("D", My.Resources.MyImages.D) 
imageList.Images.Add("E", My.Resources.MyImages.E) 
.... 
imageList.Images.Add("XYZ", My.Resources.MyImages.XYZ) 

И я хочу для того чтобы достигнуть этого:

Dim imagelist as new ImageList 

For Each img in GetMeAllImagesWithNameFromMyResourceFile 
    imageList.Images.Add(img.Name, img.ImageFile) 
Next 

где Имя является строкой и ImageFile System.Drawing.Bitmap

ответ

8

Посмотрите, поможет ли этот фрагмент кода.

Dim runTimeResourceSet As Object 
    Dim dictEntry As DictionaryEntry 

    runTimeResourceSet = My.Resources.ResourceManager.GetResourceSet(System.Globalization.CultureInfo.CurrentCulture, False, True) 
    For Each dictEntry In runTimeResourceSet 
     If (dictEntry.Value.GetType() Is GetType(Icon)) Then 
      Console.WriteLine(dictEntry.Key) 
     End If 
    Next 

В качестве примера я использовал значок, который вам нужно будет изменить, если вы используете Bitmap.

EDIT: вам нужно будет использовать ссылку dictEntry.Value & посмотреть, как его можно использовать для добавления его в imagelist.

+0

Отлично работает, именно то, что я хотел. Всего 2 небольших изменения: во-первых: второй параметр GetResourceSet должен быть истинным (чтобы получить ссылку, даже если Resouce еще не загружен). Второе: Icon.GetType() не будет работать, потому что вы его не задали, вместо этого он должен быть GetType (Icon). Возможно, вы можете отредактировать свой пост, чтобы исправить это. –

+0

Если я правильно помню, этот фрагмент кода работает с Icon.GetType(). Я поменяю его на GetType (значок) согласно вашему предложению. – shahkalpesh

+0

Он будет работать в Windows Form, потому что у вас есть свойство Form1.Icon, которое возвращает фактическую иконку формы. Но GetType (Icon) - это чистое решение. –

0

Попробуйте что-то вроде этого:

Dim reader As New ResXResourceReader(resxFilePath) 

Dim en As IDictionaryEnumerator 
en = reader.GetEnumerator() 

While en.MoveNext() 
    Console.WriteLine("Resource Name: [{0}] = {1}", en.Key, en.Value) 
End While 

reader.Close() 

Вы можете найти больше примеров, которые могут помочь вам в this link. Примеры написаны на C#, но их не очень сложно изменить для vb.net.

+0

I предположим, что он хочет загрузить встроенные ресурсы. Вышеприведенный код работает для внешних файлов RESX. –

1

На C# вы можете легко перевести это на VB.

Assembly executingAssembly = GetExecutingAssembly(); 

foreach (string resourceName in executingAssembly.GetManifestResourceNames()) 
{ 
    Console.WriteLine(resourceName); 
} 

Теперь, когда у вас есть все имена ресурсов, вы можете пройти по списку и сделать что-то вроде:

foreach(string s in executingAssembly.GetManifestResourceNames()) 
{ 
    if (s.EndsWith(".bmp")) 
    { 
     imgStream = a.GetManifestResourceStream(s); 
     if (imgStream != null) 
     {      
      bmp = Bitmap.FromStream(imgStream) as Bitmap; 
      imgStream.Close(); 
     } 
    } 
} 

Я не пробовал это, но он должен работать.

+0

GetManifestResourceNames перечисляет все мои ресурсы (например, [WindowsApplication1.Images.resources | WindowsApplication1.Resources.resources | WindowsApplication1.Form1.resources]). Не то, что я хочу. –

0

Хотя выше ответы указал мне в правильном направлении, я добавляю отдельный ответ для уточнения использования GetResourceSet и последующей загрузки изображений:

 Dim resSet As Resources.ResourceSet = My.Resources.ResourceManager.GetResourceSet(Globalization.CultureInfo.InvariantCulture, True, False) 
     For Each de As DictionaryEntry In resSet 
      If (de.Value.GetType() Is GetType(Bitmap)) Then 
       m_Icons.Add(de.Key, My.Resources.ResourceManager.GetObject(de.Key)) 
      End If 
     Next 

Обратите внимание на следующие аргументы в My.Resources.ResourceManager. GetResourceSet:

  • использование InvariantCulture
  • Для загрузки ресурсов требуется True, так как на данный момент в моей библиотеке классов я еще не получил доступ к набору ресурсов, и это заставляет его загружаться.Это, кажется, что @ bcrgen-steinblock означал в своем комментарии, но это было неправильно понято в последующем редактировать
  • ложь нормально для меня, потому что у меня нет ресурса резервного/набор по умолчанию
Смежные вопросы