ListViewItem图像未显示在虚拟ListView上

时间:2013-04-08 09:19:57

标签: c# .net winforms listview

我有一个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;
    }
}

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