Winforms将图像插入索引为

时间:2018-11-15 21:21:06

标签: c# winforms listview imagelist

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);

1 个答案:

答案 0 :(得分:0)

显然,这是设计决定。 ImageList.ImagesImageCollection,因此,它实现了 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;
}
相关问题