2009-06-16 201 views
4

在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是一个字符串和镜像文件一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 

我已经使用Icon作为示例,如果您使用的是位图,则必须更改该图标。

编辑:你将不得不使用dictEntry.Value &的引用,看看它如何被用来将它添加到imagelist。

+0

工程很棒,正是我想要的。只是2个小小的改动:第一:GetResourceSet的第二个参数应该是真的(即使Resouce尚未加载,也可以获得参考)。第二:Icon.GetType()不会工作,因为你没有实例化它,它应该是GetType(Icon)。也许你可以编辑你的文章来纠正这个问题。 – 2009-06-17 07:06:55

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

我假设他想加载嵌入式资源。上面的代码适用于外部RESX文件。 – 2009-06-16 11:28:04

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])。不是我想要的。 – 2009-06-16 15:16:16

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的的
  • 是需要加载资源,因为在我的类库中的这一点,我还没有访问资源集,这迫使它加载。这似乎是什么// @在他的评论意味着bcrgen-steinblock,但它在随后的编辑误解
  • 是确定适合我,因为我没有回退/默认的资源集