c # MeasureItemEvent обработчик: e.ItemHeight не меняется - PullRequest
0 голосов
/ 14 сентября 2009

Это я или я могу установить высоту элемента - e.ItemHeight - один раз для списка?

Несмотря на то, что я обрабатываю MeasureItemEvent в своем списке владельца и устанавливаю для e.ItemHeight правильное значение, будет использоваться только первая установленная высота.

Упс, я новичок в этом, извините за это. Это код (DrawItemHandler, конечно, в самой программе):

// 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;
}

1 Ответ

3 голосов
/ 14 сентября 2009

e.ItemHeight инициализируется на ListBox.ItemHeight при срабатывании события. Не сохраняет ранее установленное значение. Вы должны либо изменить ListBox.ItemHeight, либо отслеживать изменения в переменной.


РЕДАКТИРОВАТЬ: (после комментария)

Событие наступает при добавлении нового элемента и только для этого элемента. Вызывается также для всех предметов, когда вы звоните ListBox.Refresh().

Насколько я понимаю ваш код, вам нужно увеличить / уменьшить ItemHeight для всех ваших предметов одновременно.

-> Я думаю, вам нужно позвонить ListBox.Refresh при обновлении TrackBar.


РЕДАКТИРОВАТЬ 2:

На практике высота элементов изменяется, когда ListBox получает WM_MEASUREITEM , что происходит только при его первом создании или при добавлении элемента. После создания ListBox и всех его элементов при инициализации дальнейшие изменения в пределах listBox1_MeasureItem для существующих элементов из-за обновления бесполезны (видно с помощью Reflector).

Я нашел способ принудительно отправить WM_MEASUREITEM в ListBox без удаления и добавления всех элементов:

In place of ListBox.Refresh(), put:

ListBox.DrawMode = DrawMode.Normal;
ListBox.DrawMode = DrawMode.OwnerDrawVariable;
...