在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
我已经使用图标作为一个例子,你将不得不如果您正在使用位图来改变。
编辑:你将不得不使用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参数如下:
- 使用InvariantCulture的的
- 真正需要加载资源,在我的类库这点我还没有访问的资源集,这迫使它加载。 这似乎是什么// @ bcrgen-steinblock在他的评论的意思,但在随后的编辑误解
- 假的是确定适合我,因为我没有回退/默认的资源集