Não é possível definir o DropDownHeight da caixa de combinação
Não consigo obter o conjunto DropDownHeight do ComboBox corretamente para exibir todos os itens.
Eu estou usando um controle que herda da caixa de combinação. Eu substituí os métodos OnDrawItem e OnMeasureItem para criar várias colunas e quebra de texto em uma coluna, se necessário. Isso tudo funciona bem.
O problema ocorre quando tento definir o DropDownHeight. Eu defino o DropDownHeight em um valor arbitrariamente grande, um pouco maior que a lista de itens. O controle ComboBox parece truncar automaticamente qualquer valor para DropDownHeight que seja maior que o tamanho de todos os itens exibidos na lista. (Supondo que você tenha a propriedade MaxDropDownItems definida acima do número de itens, o que eu faço.) Normalmente esse comportamento funciona perfeitamente, como mostrado abaixo:alt text http://www.freeimagehosting.net/uploads/dd09404697.png
Não, não são meus dados reais na caixa suspensa.
O problema ocorre quando tenho uma entrada na lista suspensa que precisa ser agrupada para exibir o texto completo. Essa entrada é exibida corretamente, mas, no entanto, a caixa de combinação está calculando o DropDownHeight, ele ignora o fato de que uma das entradas é duas vezes mais alta que o normal, então você precisa rolar uma linha para chegar à última entrada na lista suspensa.alt text http://www.freeimagehosting.net/uploads/d0ef715f83.png
Este é o código que estou usando para determinar se um item precisa de quebra de texto e para definir a altura de cada item:
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
Eu não posso determinar como forçar a propriedade DropDownHeight para ser exatamente o valor que eu quero ou como deixar o controle ComboBox saber que um (ou mais) dos itens na lista são mais altos que o normal.
Eu tenteiSobrepor Sombreie a propriedade DropDownHeight, mas isso parece não ter impacto.
EDITAR:
A mudança para o WPF faria esse problema desaparecer? (Há personalização suficiente nos controles padrão do WPF para que eu não precise escrever um controle personalizado para uma caixa de combinação de 3 colunas e altura variável?)