Windows.Forms.ListBox с ошибкой OwnerDrawVariable?

В Windows.Forms.ListBox с свойством DrawMode установленным OwnerDrawVariable , ListBox похоже, OwnerDrawVariable высоту элементов, что хорошо.

НО, будучи высотой элемента, зависящей от ширины, потому что она использует Graphics.MeasureString для переноса слов, необходимо вычислить высоту элементов, если размер ListBox изменился. Тогда есть проблема.

ListBox не делает этого по умолчанию, и я не могу найти способ очистки кэша, заставляя ListBox поднять событие itemheight.

Любое решение? Я попытался получить источник для ListBox, но не нашел ничего об этом, чтобы создать производный class и очистить этот кеш.

(Пробовал копировать элементы в массив, очищая ListBox.Items и tem, добавляя массив снова. Это даже исключает исключения, поскольку ListBox вызывает события drawitem или itemheight с недопустимым индексом элемента)

Согласно этому MSDN

Сообщение LB_SETITEMHEIGHT

Устанавливает высоту в пикселях элементов в списке. Если в поле списка есть стиль LBS_OWNERDRAWVARIABLE , это сообщение устанавливает высоту элемента, заданного параметром wParam. В противном случае это сообщение устанавливает высоту всех элементов в списке.

Так что это будет делать это

 private const int LB_SETITEMHEIGHT = 0x01A0; [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); private void ListBoxExample_Resize(object sender, EventArgs e) { for (int i = 0; i < ListBoxExample.Items.Count; i++) { MeasureItemEventArgs eArgs = new MeasureItemEventArgs(null, i); ListBoxExample_MeasureItem((object)ListBoxExample, eArgs); SendMessage((IntPtr) ListBoxExample.Handle, LB_SETITEMHEIGHT, (IntPtr) i, (IntPtr) e.ItemHeight); } } 

MeasureItemEventArgs принимает объект Graphics , если необходимо, создает его из MeasureItemEventArgs управления и передает его в первом аргументе.