如何获取资源文件中所有资源的名称
在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
看看这段代码是否有帮助。
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。
尝试是这样的:
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修改它们。
我假设他想加载嵌入式资源。上面的代码适用于外部RESX文件。 – 2009-06-16 11:28:04
以下是用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();
}
}
}
我没有试过,但它应该工作。
GetManifestResourceNames枚举我的所有资源(例如[WindowsApplication1.Images.resources | WindowsApplication1.Resources.resources | WindowsApplication1.Form1.resources])。不是我想要的。 – 2009-06-16 15:16:16
虽然上面的答案指出我在正确的方向,我加入了一个单独的回答澄清使用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,但它在随后的编辑误解
- 假是确定适合我,因为我没有回退/默认的资源集
工程很棒,正是我想要的。只是2个小小的改动:第一:GetResourceSet的第二个参数应该是真的(即使Resouce尚未加载,也可以获得参考)。第二:Icon.GetType()不会工作,因为你没有实例化它,它应该是GetType(Icon)。也许你可以编辑你的文章来纠正这个问题。 – 2009-06-17 07:06:55