Winforms,C#,VS2017
ImageList没有插入方法(但是ListViewItemCollection有)。我尝试了几种不同的方法将新图像插入到ListView的中间,它是LargeImageList,但没有使其正常工作。
任何人都可以正常使用任何经过验证的代码吗?
这就是我所拥有的,但是图像无法正确同步到列表中的项目。
protected void InsertThumbnail(string key, string keySelected)
{
var newImageList = new ImageList()
{
ImageSize = new Size(thumbWidth, thumbHeight)
};
var itemNew = new ListViewItem();
var foundSelected = false;
//lvAllPages.BeginUpdate();
for (int i = 0; i < lvAllPages.Items.Count; i++)
{
var item = lvAllPages.Items[i];
newImageList.Images.Add(item.Tag.ToString(), lvAllPages.LargeImageList.Images[i]);
if (item.Tag.ToString() == keySelected)
{
var image = batch.GetThumbnail(key);
newImageList.Images.Add(key, image);
itemNew = new ListViewItem()
{
BackColor = Color.Aquamarine,
ImageIndex = i,
Tag = key,
};
if (isLocal)
itemNew.Text = $"{GetFileName(key)} (insert) - {itemNew.ImageIndex}";
foundSelected = true;
}
if (foundSelected)
{
item.ImageIndex = item.ImageIndex + 1;
if (isLocal)
item.Text = $"{GetFileName(item.Tag.ToString())} - {item.ImageIndex}";
}
}
lvAllPages.LargeImageList.Dispose();
lvAllPages.LargeImageList = newImageList;
lvAllPages.Items.Insert(itemNew.ImageIndex, itemNew);
}
另一件事,但与我遇到的问题无关。对于正在研究此问题且有类似问题的任何人,这有助于解决在插入新项目后对项目进行排序的问题。当您在给定的索引处插入新的ListViewItem时的默认行为,它将出现在列表的底部。我发现这个方便的类可以使项目按索引排序,从而解决了该问题:
class CompareByIndex:IComparer { 私有只读ListView _listView;
public CompareByIndex(ListView listView)
{
this._listView = listView;
}
public int Compare(object x, object y)
{
int i = this._listView.Items.IndexOf((ListViewItem)x);
int j = this._listView.Items.IndexOf((ListViewItem)y);
return i - j;
}
}
并以加载形式:
lvAllPages.ListViewItemSorter =新的CompareByIndex(lvAllPages);
答案 0 :(得分:0)
显然,这是设计决定。 ImageList.Images
是ImageCollection
,因此,它实现了 IList
接口。
不幸的是,允许Insert()
方法抛出NotSupportedException
。这就是使用IList
时列表将要执行的操作:
((IList)imageList.Images).Insert(5, new Bitmap(10,10));
System.NotSupportedException:'不支持指定的方法。'
为了以特定的顺序显示图像,请使用采用密钥的Add()
方法:
imageList.Images.Add("1", new Bitmap(100,100));
这也应该使您能够替换图像:
imageList.Images.RemoveByKey("1");
imageList.Images.Add("1", new Bitmap(200,200));
要使其正常工作,您需要设置Sorting属性:
listView1.Sorting = SortOrder.Ascending;
要存储路径等其他信息,请使用具有相同键的另一个数据结构。
代码如下:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
ImageList imageList = new ImageList();
Dictionary<string, Metadata> metadata = new Dictionary<string, Metadata>();
private string dir = @"H:\temp";
private void button1_Click(object sender, EventArgs e)
{
// You would set this in the designer, probably
listView1.Sorting = SortOrder.Ascending;
listView1.View = View.LargeIcon;
listView1.LargeImageList = imageList;
// Make sure we start from the beginning
listView1.Items.Clear();
imageList.Images.Clear();
metadata.Clear();
// Add items
for (int i = 0; i < 10; i++)
{
var filename = "1 ("+(i+1)+").png"; // Just strange names I have
var fullFileName = Path.Combine(dir, filename);
imageList.Images.Add(i.ToString(), Bitmap.FromFile(fullFileName));
metadata.Add(i.ToString(), new Metadata{Path = fullFileName});
listView1.Items.Add(i.ToString(), "Image " + i, i.ToString());
}
// Update view
listView1.Refresh();
listView1.Invalidate();
}
private void button2_Click(object sender, EventArgs e)
{
for (int i = 3; i < 6; i++)
{
var filename = "1 ("+(i+2)+").png";
var fullFileName = Path.Combine(dir, filename);
// Change image
imageList.Images.RemoveByKey(i.ToString());
imageList.Images.Add(i.ToString(), Bitmap.FromFile(fullFileName));
// Match metadata and image
metadata[i.ToString()] = new Metadata{Path = fullFileName};
}
listView1.Refresh();
}
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count > 0)
{
var key = listView1.SelectedItems[0].ImageKey;
label1.Text = metadata[key].Path;
}
else
{
label1.Text = "No image selected";
}
}
}
internal class Metadata
{
internal string Path;
}