c # MeasureItemEvent manipulador: e.ItemHeight não mudar
-
07-07-2019 - |
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;
}
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;