При добавлении элемента (ов) к ListView
в любом другом режиме, чем LargeIcon
зрения, ListView
остановки, показывающие изображения из LargeImageList
, когда он переключается обратно на LargeIcon
. Эта ситуация сохраняется до добавления нового элемента в ListView
в режиме LargeIcon
.ListView не показывает изображения после переключения режима просмотра
Таким образом, следующая последовательность иллюстрирует проблему:
- создать
ListView
, добавить столбец, установитеView
вDetails
- создать
ImageList
, установитьImageSize
, присвоить егоListView.LargeImageList
- создать новую
ListViewItem
, установите егоImageKey
- создать новое изображение, добавить его в
ImageList
с заданным ключом - добавить
ListViewItem
для переключенияListView
- режим
ListView
кLargeIcon
- изображения не показаны
- повторите шаги # 3 - # 6, теперь в режиме
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;
}
}
EDIT:
Для тех, кто будет страдать той же проблемой. После некоторых экспериментов, есть по крайней мере, глупо бедняка обходной путь:
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);
}
}
EDIT # 2: Я также обнаружил некоторые другие забавные особенности в ListView
и связанные с ним компоненты имеют. Вы можете проверить их в ответах question 4097912 и question 23059678
Я думаю, вы не установили SmallImageList в список изображений, проверьте его – CuriousPen
Правильно, я этого не сделал. Мне не нужны маленькие значки, просто большие или текстовые (подробности). Требуется ли SmallImageList для правильной работы режима LargeIcon? – sharpener