更改 ImageList 的 ImageSize 属性显示空白图像

The*_*722 4 .net vb.net listview imagelist

在 Visual Studio 中的 VB.Net 解决方案中,我有一个 ListView 和一个与该 ListView 关联的 ImageList。它被设置为LargeImageList 和SmallImageList。

这是不以编程方式更改 ImageList 的 ImageSize 属性的情况下的样子:

但是,如果我通过以下方式调整 ImageList 的大小:

ImageList1.ImageSize = New Size(64, 64)
Run Code Online (Sandbox Code Playgroud)

或任何其他尺寸,我得到这个:

之后我尝试调用ListView1.Refresh(),仍然没有。

我什至试过:

ListView1.LargeImageList.ImageSize = New Point(64, 64)
Run Code Online (Sandbox Code Playgroud)

项目运行时如何动态设置图标的大小?我需要能够将它们调整为多种尺寸(即 32x32、64x64、96x96 等)

ImageList 中的图像都是 128x128 的,这样可以更容易地缩小它们。

Ňɏs*_*arp 5

更改ImageSize正在重新创建的句柄中的结果,这可能会破坏链接或分配。这在 MSDN 上有解释。当您更改ColorDepth;时,它还警告图像被删除;但至少在某些情况下,当您更改大小时,这似乎也会发生:

imgLst.ImageSize = New Size(64, 64)
Dim num = ImgLst.Images.Count          ' == 0
Run Code Online (Sandbox Code Playgroud)

无论如何,反复更改一组的大小可能不是一个好主意:从 32 调整到 128 可能会产生可怕的结果。有效的方法是让一个ImageList包含 128x128 图像的主节点。当您想更改大小时,将它们复制到ImageList新大小的“工作”中:

Private Sub LoadImagesWithSize(sz As Size)

    imgLst.ImageSize = sz
    imgLst.Images.Clear
    For n As Int32 = 0 To ImageList128.Images.Count - 1
        imgLst.Images.Add(ImageList128.Images(n))
    Next
    myLV.LargeImageList = imgLst

End Sub
Run Code Online (Sandbox Code Playgroud)

称之为:

LoadImagesWithSize(New Size(64, 64))
Run Code Online (Sandbox Code Playgroud)

而不是ImageList每个可能的尺寸,有一个“主”和“活动”尺寸版本。它似乎工作正常。