当我以ListView
查看模式以外的LargeIcon
向ListView
添加项目时,LargeImageList
会在切换回LargeIcon
时停止显示ListView
的图像到LargeIcon
。这种情况会持续到ListView
模式下View
添加新项目为止。
以下序列说明了问题:
Details
,添加列,将ImageList
设置为ImageSize
ListView.LargeImageList
,设置ListViewItem
,将其分配给ImageKey
ImageList
,设置其ListViewItem
ListView
ListView
添加到LargeIcon
LargeIcon
模式切换为ListView
LargeImageList
模式
我还缺少什么?
我试过以下:
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
修改
对于任何遭遇同样问题的人。经过一些实验,至少有一个愚蠢的穷人的解决方法:
修改LargeIcon
,ImageList
以某种方式检测到其更改并重新加载 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 4097912和question 23059678
的答案中查看它们答案 0 :(得分:1)
解决您的问题
您可以使用ImageIndex
代替ImageKey
将ListView
与ImageList
相关联,从而避免这种情况。因此,在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
时视图,ImageIndex
为null
或-1
,ImageKey
将被忽略。
关于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" ;
}