5

在 Visual Basic 项目中,我添加了一个包含一堆图像的资源文件 (resx)。

现在我想查询图像的名称。如果我在 Visual Studio IDE 的设计器视图中打开 resx 文件并选择一个图像,属性网格会显示一个名称属性(默认为“没有扩展名但可以更改的文件名)。

背景是我有一个在运行时创建的图像列表,并用资源文件中的图像填充。为了能够通过密钥访问这些图像,我必须进行设置。

我的代码看起来像这样(所有内容都是硬编码的):

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

4 回答 4

10

看看这段代码是否有帮助。

    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 的参考并查看它如何用于将其添加到 imagelist。

于 2009-06-16T16:41:22.657 回答
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();
        }   
    }
}

我没有尝试过,但它应该可以工作。

于 2009-06-16T11:27:26.870 回答
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()

您可以在此链接中找到更多可以帮助您的示例。这些示例是用 C# 编写的,但是为 vb.net 修改它们并不难

于 2009-06-16T11:13:53.030 回答
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 在他的评论中的意思,但在随后的编辑中被误解了
  • false对我来说没问题,因为我没有后备/默认资源集
于 2017-11-08T02:32:31.257 回答