题
在 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
解决方案
看看这段代码是否有帮助。
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&的引用。看看如何将它添加到图像列表中。
其他提示
以下是用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();
}
}
}
我没试过,但它应该有用。
尝试这样的事情:
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修改它们并不是很难。
虽然上面的答案为我指明了正确的方向,但我添加了一个单独的答案来阐明 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:
- 用于不变文化
- 真的 需要加载资源,因为此时在我的类库中我尚未访问资源集,这会强制加载它。这似乎是 @bcrgen-steinblock 在他的评论中的意思,但在随后的编辑中被误解了
- 错误的 对我来说没问题,因为我没有后备/默认资源集
不隶属于 StackOverflow