Intereting Posts
Преобразовать System.Windows.Media.ImageSource в ByteArray Возможно ли отправить HttpWebRequest с использованием TLS1.2 на платформе .NET 4.0 Лучший способ печати для клиентов Windows (не веб-приложений)? Значение привязки не передается пользователю в WPF Как заменить верхний регистр нижним регистром с помощью регулярного выражения? Как правильно разбить CSV с помощью функции C # split ()? Ошибка при проверке SalesForce от C # Client (s) Использование InstallUtil для установки службы Windows с параметрами запуска Обновление NewtonSoft JSON.NET неявно сериализует защищенные члены Использует ли выражение lambda, переданное в метод, замедляет запрос Entity Framework? ComboBox items.count не соответствует datasource (C #) Перечислите месяцы между двумя датами Как читать удаленные ключи реестра? Использование исключений, бросающих C #. Это влияет на производительность? В C # было бы лучше использовать Queue.Synchronized или lock () для безопасности streamов?

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 управления и передает его в первом аргументе.