Controlador c # MeasureItemEvent: e.ItemHeight no cambia
-
07-07-2019 - |
Pregunta
¿Soy yo o solo puedo establecer la altura del elemento, e.ItemHeight, una vez para un cuadro de lista?
Aunque manejo el MeasureItemEvent en mi cuadro de lista dibujado por el propietario y establezco e.ItemHeight en el valor correcto, solo se utilizará la primera altura establecida.
Vaya, soy nuevo en esto, lo siento por eso. Este es el código (DrawItemHandler, por supuesto, está en el 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;
}
Solución
e.ItemHeight
se inicializa en ListBox.ItemHeight
en la activación del evento. No guarda su valor establecido previamente. Debe modificar ListBox.ItemHeight
, o realizar un seguimiento de sus modificaciones en una variable.
EDITAR: (siguiendo el comentario)
El evento se dispara cuando se agrega un nuevo elemento y solo para ese elemento.
También se activa para todos los elementos cuando llama a ListBox.Refresh ()
.
Según entiendo su código, debe aumentar / disminuir ItemHeight para todos sus artículos a la vez.
- > Creo que debe llamar a ListBox.Refresh
cuando actualice TrackBar.
EDITAR 2:
En la práctica, la altura de los elementos cambia cuando ListBox recibe WM_MEASUREITEM que solo ocurre cuando se crea por primera vez o cuando se agrega un elemento. Después de la creación de ListBox y todos sus elementos en la inicialización, los cambios adicionales dentro de listBox1_MeasureItem
para los elementos existentes debido a una actualización son inútiles (visto con la ayuda de Reflector).
Encontré una manera de forzar un WM_MEASUREITEM
para que se envíe al ListBox sin eliminar y agregar todos los elementos:
In place of ListBox.Refresh(), put:
ListBox.DrawMode = DrawMode.Normal;
ListBox.DrawMode = DrawMode.OwnerDrawVariable;