Я не могу правильно установить DropDownHeight ComboBox для отображения всех элементов.
Я использую элемент управления, который наследуется от ComboBox. Я переопределил методы OnDrawItem и OnMeasureItem, чтобы создать несколько столбцов и перенос текста в столбце, если это необходимо. Это все отлично работает.
Проблема возникает, когда я пытаюсь установить DropDownHeight. Я установил DropDownHeight на произвольно большое значение, чуть больше, чем список элементов. Элемент управления ComboBox автоматически обрезает любое значение для DropDownHeight, превышающее размер всех отображаемых элементов в списке. (Предполагая, что у вас свойство MaxDropDownItems установлено выше, чем количество элементов, что я делаю.) Обычно это поведение работает отлично, как показано ниже:
альтернативный текст http://www.freeimagehosting.net/uploads/dd09404697.png
Нет, это не мои реальные данные в раскрывающемся списке.
Проблема возникает, когда в раскрывающемся списке есть запись, которую необходимо перенести, чтобы отобразить полный текст. Эта запись отображается нормально, но, хотя ComboBox вычисляет DropDownHeight, он игнорирует тот факт, что одна из записей в два раза больше обычного, поэтому вам нужно прокрутить одну строку вниз, чтобы перейти к последней записи в раскрывающемся списке.
альтернативный текст http://www.freeimagehosting.net/uploads/d0ef715f83.png
Это код, который я использую, чтобы определить, нуждается ли элемент в переносе текста и установить высоту каждого элемента:
Protected Overrides Sub OnMeasureItem(ByVal e As System.Windows.Forms.MeasureItemEventArgs)
MyBase.OnMeasureItem(e)
//Determine the proper height of the current row in the dropdown based on
//the length of the OptionDescription string.
Dim tmpStr As String = FilterItemOnProperty(Items(e.Index), "OptionDescription")
Dim lng As Single = e.Graphics.MeasureString(tmpStr, Me.Font).Width
//Use the length of the item and the width of the column to calculate if wrapping is needed.
Dim HeightMultiplier As Integer = Math.Floor(lng / _ColumnWidths(1)) + 1
e.ItemHeight = e.ItemHeight * HeightMultiplier
End Sub
Я не могу определить, как заставить свойство DropDownHeight быть именно тем значением, которое я хочу, или как сообщить элементу управления ComboBox, что один (или более) элементов в списке выше, чем обычно.
Я пытался переопределить Затенить свойство DropDownHeight, но это, похоже, не оказало влияния.
EDIT:
Может ли переход на WPF решить эту проблему? (Достаточно ли настраиваемости в стандартных элементах управления WPF, чтобы мне не нужно было писать пользовательский элемент управления для комбинированного списка с 3 столбцами переменной высоты?)