我有一个System.Windows.Forms.ListView。在正常(非虚拟)操作下,ListViewItems正确显示其图像。但是,当我尝试将ListView转换为虚拟模式时,项目不再显示其图像。其他所有内容(文本,索引等)都按预期显示。
ListView处于“详细信息”模式。 SmallImageList已正确设置。每个ListViewItem都正确设置了ImageKey。 ImageList已正确填充。
为什么图像没有显示在虚拟ListView上? 我该怎么做才能确保图像按预期显示?
编辑:请参阅以下代码作为演示我遇到的问题的示例。
static class Program
{
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new VirtualListViewExample());
}
}
class VirtualListViewExample : Form
{
public VirtualListViewExample()
{
Image image = new Bitmap(16, 16);
using (Graphics g = Graphics.FromImage(image))
{
g.FillRectangle(Brushes.Black, 0, 0, 16, 16);
}
ImageList imageList = new ImageList();
imageList.ColorDepth = ColorDepth.Depth32Bit;
imageList.ImageSize = new Size(16, 16);
imageList.Images.Add("key", image);
ListView normalList = new ListView();
normalList.Columns.Add("Column");
normalList.Dock = DockStyle.Fill;
normalList.View = View.Details;
normalList.VirtualMode = false;
normalList.SmallImageList = imageList;
for (int i = 0; i < 100; i++)
{
ListViewItem item = new ListViewItem();
item.Text = "Item " + i.ToString();
item.ImageKey = "key";
normalList.Items.Add(item);
}
ListView virtualList = new ListView();
virtualList.Columns.Add("Column");
virtualList.Dock = DockStyle.Fill;
virtualList.View = View.Details;
virtualList.VirtualMode = true;
virtualList.SmallImageList = imageList;
virtualList.RetrieveVirtualItem += (s, e) =>
{
e.Item = new ListViewItem();
e.Item.Text = "Item " + e.ItemIndex.ToString();
e.Item.ImageKey = "key";
};
virtualList.VirtualListSize = 100;
SplitContainer split = new SplitContainer();
split.Dock = DockStyle.Fill;
split.Panel1.Controls.Add(normalList);
split.Panel2.Controls.Add(virtualList);
this.Controls.Add(split);
split.SplitterDistance = split.Width / 2;
}
}
答案 0 :(得分:2)
我知道这是一个老问题,但为了寻找这个的人:
在虚拟模式下,item.ImageKey不起作用。请改用item.ImageIndex。 ImageList.ImageCollection有一个IndexOfKey()方法,用于将密钥转换为索引。
virtualList.RetrieveVirtualItem += (s, e) =>
{
e.Item = new ListViewItem();
e.Item.Text = "Item " + e.ItemIndex.ToString();
e.Item.ImageIndex = imagelist.Images.IndexOfKey("key");
};
答案 1 :(得分:1)
如何使用ListView控件和ImageList作为c'tor的局部变量?如果它们是VirtualListViewExample类的成员,它会更好吗?
更新:我上面的建议是完全错误的。有关此问题的解决方法,请参阅duplicate question。