Как получить имена всех ресурсов в файле ресурсов

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

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

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

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

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

где Name - это строка, а ImageFile - это System.Drawing.Bitmap.


person Jürgen Steinblock    schedule 16.06.2009    source источник


Ответы (4)


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

    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

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

РЕДАКТИРОВАТЬ: вам нужно будет использовать ссылку на dictEntry.Value и посмотреть, как ее можно использовать для добавления в список изображений.

person shahkalpeshp    schedule 16.06.2009
comment
Отлично работает, именно то, что я хотел. Всего два небольших изменения: Первое: второй параметр GetResourceSet должен иметь значение true (чтобы получить ссылку, даже если Resouce еще не загружен). Во-вторых: Icon.GetType () не будет работать, потому что вы не создали его экземпляр, вместо этого он должен быть GetType (Icon). Возможно, вы могли бы отредактировать свой пост, чтобы исправить это. - person Jürgen Steinblock; 17.06.2009
comment
Если я правильно помню, этот фрагмент кода работает с Icon.GetType (). Я изменю его на GetType (Icon) в соответствии с вашим предложением. - person shahkalpeshp; 17.06.2009
comment
Он будет работать в Windows Form, потому что у вас есть свойство Form1.Icon, которое возвращает фактический значок формы. Но GetType (Icon) - чистое решение. - person Jürgen Steinblock; 17.06.2009

Следующее написано на 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();
        }   
    }
}

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

person Thorsten Dittmar    schedule 16.06.2009
comment
GetManifestResourceNames перечисляет все мои ресурсы (например, [WindowsApplication1.Images.resources | WindowsApplication1.Resources.resources | WindowsApplication1.Form1.resources]). Не то, что я хочу. - person Jürgen Steinblock; 16.06.2009

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

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()

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

person alex    schedule 16.06.2009
comment
Я полагаю, он хочет загрузить встроенные ресурсы. Приведенный выше код работает для внешних файлов RESX. - person Thorsten Dittmar; 16.06.2009

Хотя приведенные выше ответы указали мне в правильном направлении, я добавляю отдельный ответ, чтобы прояснить использование 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
  • Истина требуется для загрузки ресурсов, так как на данный момент в моей библиотеке классов я еще не получил доступ к набору ресурсов, и это заставляет его загружаться. Похоже, это то, что имел в виду @ bcrgen-steinblock в своем комментарии, но это было неправильно понято в последующем редактировании.
  • false мне подходит, потому что у меня нет набора резервных ресурсов или ресурсов по умолчанию
person user3085342    schedule 08.11.2017