在属性Windows.Forms.ListBox
设置为DrawMode
的{{1}}中,OwnerDrawVariable
似乎缓存了项目的高度,这是好事。
但是,作为项目高度取决于宽度,因为它使用ListBox
进行自动换行,如果Graphics.MeasureString
的大小发生了变化,则需要计算项目的高度。然后就出现了问题。
ListBox
默认不执行此操作,我找不到清除缓存的方法,强制ListBox
引发itemheight事件。
任何解决方案?我试图获取ListBox的源代码,但没有找到任何关于它的内容来创建派生类并清除此缓存。
(尝试将项目复制到数组,清除ListBox
,然后再次添加数组。这甚至会抛出异常,因为ListBox.Items
调用带有无效项索引的drawitem或itemheight事件)< / p>
答案 0 :(得分:1)
根据this MSDN
LB_SETITEMHEIGHT消息
设置列表框中项目的高度(以像素为单位)。如果列表框有 LBS_OWNERDRAWVARIABLE 样式,此消息设置项目的高度 由wParam参数指定。否则,此消息设置高度 列表框中的所有项目。
所以这样做
private const int LB_SETITEMHEIGHT = 0x01A0;
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
private void ListBoxExample_Resize(object sender, EventArgs e)
{
for (int i = 0; i < ListBoxExample.Items.Count; i++)
{
MeasureItemEventArgs eArgs = new MeasureItemEventArgs(null, i);
ListBoxExample_MeasureItem((object)ListBoxExample, eArgs);
SendMessage((IntPtr) ListBoxExample.Handle, LB_SETITEMHEIGHT, (IntPtr) i, (IntPtr) e.ItemHeight);
}
}
MeasureItemEventArgs
接受Graphics
对象,如有必要,从控件创建一个并在第一个参数中传递它。