C# Windows.Forms.ListBox是否存在OwnerDrawVariable错误?
在属性C# Windows.Forms.ListBox是否存在OwnerDrawVariable错误?,c#,winforms,listbox,C#,Winforms,Listbox,在属性DrawMode设置为OwnerDrawVariable的Windows.Forms.ListBox中,ListBox似乎缓存了项目的高度,这很好 但是,由于项目高度依赖于宽度,因此它使用图形。MeasureString进行文字换行,如果列表框的大小发生变化,则需要计算项目高度。那就有问题了 默认情况下,ListBox不会执行此操作,并且我找不到清除缓存的方法,从而强制ListBox引发itemheight事件 有解决办法吗?我试图获取ListBox的源代码,但没有找到任何与此相关的内容,
DrawMode
设置为OwnerDrawVariable
的Windows.Forms.ListBox
中,ListBox
似乎缓存了项目的高度,这很好
但是,由于项目高度依赖于宽度,因此它使用图形。MeasureString
进行文字换行,如果列表框的大小发生变化,则需要计算项目高度。那就有问题了
默认情况下,ListBox
不会执行此操作,并且我找不到清除缓存的方法,从而强制ListBox
引发itemheight事件
有解决办法吗?我试图获取ListBox的源代码,但没有找到任何与此相关的内容,无法生成派生类并清除此缓存
(尝试将项目复制到数组,清除列表框.items
,然后再次添加数组。这甚至会引发异常,因为列表框
调用具有无效项目索引的drawitem或itemheight事件)
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);
}
}
private const int LB_SETITEMHEIGHT=0x01A0;
[DllImport(“user32.dll”)]
公共静态外部int SendMessage(IntPtr hWnd、int wMsg、IntPtr wParam、IntPtr lParam);
私有无效列表框示例_调整大小(对象发送方,事件参数e)
{
对于(int i=0;i
MeasureItemEventArgs
接受一个图形
对象,如有必要,从控件创建一个对象并在第一个参数中传递它。请参阅@HansPassant绘图函数,如无效
,刷新
和更新
,如果这样做将很容易。@LarsTech谢谢,很遗憾,MeasureItem事件仅在句柄创建时发生,这非常令人沮丧。@LarsTechRecreateHandle()
似乎有点开销,因为我在源代码中找不到任何关于项高度的信息(但它是一个较旧的),这应该在非托管代码中完成吗?如果你愿意,把你的话作为答案贴在周围。你可以删除该项目并将其插回。这触发了一个措施。