Pergunta

É de mim ou que só posso definir o ItemHeight - e.ItemHeight - uma vez para uma caixa de listagem?

Apesar de eu lidar com a MeasureItemEvent na minha caixa de listagem ownerdrawn e definir o e.ItemHeight para o valor correto, apenas o primeiro altura que está definido será usado.

Opa, eu sou novo para isso, sinto muito por isso. Este é o código (DrawItemHandler é, naturalmente, o programa real):

// Add eventhandler to draw and measure items
this.listBox1.DrawItem += new DrawItemEventHandler(this.DrawItemHandler);
this.listBox1.MeasureItem += new MeasureItemEventHandler(this.MeasureItemHandler);

// The eventhandler itself
private void MeasureItemHandler(object sender, MeasureItemEventArgs e)
{
    e.ItemHeight = Convert.ToInt32(mySettings.iCurrentSizeFactor * 10) + 1;
}
Foi útil?

Solução

e.ItemHeight é inicializado para ListBox.ItemHeight no acionamento do evento. Ele não salva é anteriormente valor definido. Você tem que quer ListBox.ItemHeight modifiy junto, ou manter o controle de suas modificações em uma variável.


EDIT: (seguindo o comentário)

O evento é acionado quando um novo item é adicionado e apenas para esse item. É disparado também para todos os itens quando você chamar ListBox.Refresh().

Como eu entendo o seu código, você precisa aumentar / diminuir ItemHeight para todos os seus itens de uma vez.

-> Eu acho que você tem que chamar ListBox.Refresh quando actualizar o TrackBar

.

EDIT 2:

Na prática, os itens de altura é alterada quando o ListBox recebe WM_MEASUREITEM o que só acontece quando é criado pela primeira vez, ou quando um item é adicionado. Após a criação da caixa de listagem e todos os seus itens de inicialização, mais mudanças dentro listBox1_MeasureItem para itens existentes devido a uma actualização são inúteis (visto com a ajuda de refletor).

Eu encontrei uma maneira de forçar um WM_MEASUREITEM a ser enviado para a caixa de listagem sem deletar e adicionar todos os itens:

In place of ListBox.Refresh(), put:

ListBox.DrawMode = DrawMode.Normal;
ListBox.DrawMode = DrawMode.OwnerDrawVariable;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top