Как получить имена всех ресурсов в файле ресурсов - PullRequest
5 голосов
/ 16 июня 2009

В проекте 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

Ответы [ 4 ]

10 голосов
/ 16 июня 2009

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

    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

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

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

1 голос
/ 16 июня 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();
        }   
    }
}

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

0 голосов
/ 08 ноября 2017

Хотя приведенные выше ответы указали мне правильное направление, я добавляю отдельный ответ для разъяснения использования 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 в своем комментарии, но это было неправильно понято в последующем редактировании
  • false мне подходит, потому что у меня нет запасного ресурса / ресурса по умолчанию
0 голосов
/ 16 июня 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...