如何获取所有资源的名称在资源文件(How to get the names of all resou

2019-09-16 08:26发布

在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

Answer 1:

看看这段代码有帮助。

    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的参考和看它如何被用于增加它的图像列表。



Answer 2:

是用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();
        }   
    }
}

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



Answer 3:

尝试是这样的:

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



Answer 4:

虽然这些答案,我指出正确的方向,我加入了一个单独的回答澄清使用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在他的评论的意思,但在随后的编辑误解
  • 假的是确定适合我,因为我没有回退/默认的资源集


文章来源: How to get the names of all resources in a resource file