c# MeasureItemEvent handler: e.ItemHeight not chan

2019-08-17 08:24发布

Is it me or can I only set the itemheight - e.ItemHeight - once for a listbox?

Although I handle the MeasureItemEvent on my ownerdrawn listbox and set the e.ItemHeight to the right value, only the first height that is set will be used.

Oops, I am new to this, sorry about that. This is the code (DrawItemHandler is of course in the actual program):

// 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条回答
欢心
2楼-- · 2019-08-17 08:31

e.ItemHeight is initialized to ListBox.ItemHeight in the event firing. It does not save it's previously set value. You have to either modifiy ListBox.ItemHeight along, or keep track of your modifications in a variable.


EDIT: (following the comment)

The event is fired when a new item is added and only for that item. It's fired also for all items when you call ListBox.Refresh().

As I understand your code, you need to increase/decrease ItemHeight for all your items at once.

--> I think you have to call ListBox.Refresh when you update the TrackBar.


EDIT 2:

In practice, items height is changed when the ListBox receives WM_MEASUREITEM which only happens when it's first created, or when an item is added. After the creation of the ListBox and all of its items at initialization, further changes within listBox1_MeasureItem for existing items due to a refresh are useless (seen with the help of Reflector).

I found a way to force a WM_MEASUREITEM to be sent to the ListBox without deleting and adding all items:

In place of ListBox.Refresh(), put:

ListBox.DrawMode = DrawMode.Normal;
ListBox.DrawMode = DrawMode.OwnerDrawVariable;
查看更多
登录 后发表回答