0

是我还是我只能为列表框设置 itemheight - 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;
}
4

1 回答 1

3

e.ItemHeightListBox.ItemHeight在事件触发时初始化为。它不会保存之前设置的值。您必须ListBox.ItemHeight修改或跟踪变量中的修改。


编辑:(在评论之后)

添加新项目时会触发该事件,并且仅针对该项目。当您调用时,它也会为所有项目触发ListBox.Refresh()

据我了解您的代码,您需要一次增加/减少所有项目的 ItemHeight。

--> 我认为你必须ListBox.Refresh在更新 TrackBar 时调用。


编辑2:

在实践中,当 ListBox 接收到WM_MEASUREITEM时,项目的高度会发生变化,这仅在首次创建或添加项目时发生。在初始化时创建 ListBox 及其所有项目之后,listBox1_MeasureItem由于刷新而对现有项目进行的进一步更改是无用的(在 Reflector 的帮助下看到)。

我找到了一种强制将 aWM_MEASUREITEM发送到 ListBox 而不删除和添加所有项目的方法:

In place of ListBox.Refresh(), put:

ListBox.DrawMode = DrawMode.Normal;
ListBox.DrawMode = DrawMode.OwnerDrawVariable;
于 2009-09-14T10:42:01.357 回答