切换视图模式后,ListView不显示图像

时间:2014-04-11 08:29:28

标签: c# .net winforms

当我以ListView查看模式以外的LargeIconListView添加项目时,LargeImageList会在切换回LargeIcon时停止显示ListView的图像到LargeIcon。这种情况会持续到ListView模式下View添加新项目为止。

以下序列说明了问题:

  1. 创建Details,添加列,将ImageList设置为ImageSize
  2. 创建ListView.LargeImageList,设置ListViewItem,将其分配给ImageKey
  3. 创建新的ImageList,设置其ListViewItem
  4. 创建新图片,将其添加到具有给定密钥的ListView
  5. ListView添加到LargeIcon
  6. LargeIcon模式切换为ListView
    • 未显示图片
  7. 重复步骤#3 - #6,现在处于LargeImageList模式
    • 所有图片均按预期显示
  8. 我还缺少什么?

    我试过以下:

    • 使null
    • 无效
    • 在添加项目之前/之后重新分配public partial class Form1 : Form { int counter = 0; ImageList iList = new ImageList(); private string GetNewKey() { return counter++.ToString(); } private Image GetNewImage(Size size) { var bmp = new Bitmap(size.Width, size.Height); using (var gra = Graphics.FromImage(bmp)) { var rnd = new Random(); var lines = rnd.Next(1000); for (int l = 0; l < lines; ++l) { var pen = new Pen(Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256))); var p1 = new Point(rnd.Next(size.Width), rnd.Next(size.Height)); var p2 = new Point(rnd.Next(size.Width), rnd.Next(size.Height)); gra.DrawLine(pen, p1, p2); } } return bmp; } public Form1() { InitializeComponent(); iList.ImageSize = new Size(100, 100); listView.LargeImageList = iList; listView.Columns.Add("name"); } private void buttonAdd_Click(object sender, EventArgs e) { var key = GetNewKey(); var lvi = new ListViewItem() { Name = key, Text = "blabla", ImageKey = key, }; iList.Images.Add(key, GetNewImage(new Size(100, 100))); listView.Items.Add(lvi); } private void buttonClear_Click(object sender, EventArgs e) { listView.Items.Clear(); } private void buttonLarge_Click(object sender, EventArgs e) { listView.View = View.LargeIcon; } private void buttonDetails_Click(object sender, EventArgs e) { listView.View = View.Details; } } (即使通过ImageList

    那些喜欢它的人的测试代码不仅仅是单词:

    ListView

    修改

    对于任何遭遇同样问题的人。经过一些实验,至少有一个愚蠢的穷人的解决方法:

    修改LargeIconImageList 以某种方式检测到其更改并重新加载 private void FixIt() { // Trigger a reload of the ListView.LargeImageList if (listView.View == View.LargeIcon) { var key = "Dummy image to be deleted right after its insertion..."; iList.Images.Add(key, new Bitmap(1, 1)); iList.Images.RemoveByKey(key); } } 模式的图片。问题是 如何检测到更改,为什么在模式更改后忽略了ListView ...

    {{1}}

    编辑#2: 我还发现了{{1}}和相关组件的其他一些有趣的功能。您可能希望在question 4097912question 23059678

    的答案中查看它们

1 个答案:

答案 0 :(得分:1)

解决您的问题

您可以使用ImageIndex代替ImageKeyListViewImageList相关联,从而避免这种情况。因此,在buttonAdd_Click事件中使用:

  var lvi = new ListViewItem()
        {
            Name     = key,
            Text     = "blabla",
            //ImageKey = key,
            //Use ImageIndex and don't set both
            ImageIndex= Convert.ToInt32(key) //you could just use count++ 
        };

此问题背后的原因:

这背后的原因我不清楚,但我认为这可能是一个错误,当从Details更改为LargeIcon时,它只会默认检查ImageIndex,如果你设置ImageKey ImageIndex将设置为-1。或者这可能是设计上的,我不知道(请参阅下面的ImageKey部分),因为您没有SmallImageList,所以在更改为LargeIcon时视图,ImageIndexnull-1ImageKey将被忽略。

关于ListViewItem.ImageIndex Property

  

ImageKey和ImageIndex属性是互斥的,这意味着如果设置了一个,则忽略另一个。此外,如果设置ImageKey属性,ImageIndex属性将自动设置为-1。或者,如果设置ImageIndex属性,ImageKey会自动设置为空字符串(&#34;&#34;)。

关于ListViewItem.ImageKey Property

  

如果您使用多个图像列表,对于小图标和大图标视图,使用ListView控件,您应该将图像的小版本和大版本放在各自图像列表中的相同索引位置。 在视图之间切换时,无论指定的键值如何,一个列表中图像的索引位置都用于定位另一个列表中的图像。

这可以通过某种方式得到验证:

  • 使用现有代码(使用ImageKey
  • ImageIndex事件处理程序中的Item中的listView设置buttonLarge_Click将显示该项目的图像。
  • ImageKey事件处理程序中的任何Item设置buttonLarge_Click都不会显示该图片。

e.g:

 private void buttonLarge_Click(object sender, EventArgs e)
        {
            listView.View = View.LargeIcon;
            //Set ImageIndex of Item 0 you could see its Icon.
            listView.Items[0].ImageIndex= 0 ;

            //set ImageKey will change nothing 
            //listView.Items[0].ImageKey= "0" ; 
        }