Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows.Forms.ListBox是否存在OwnerDrawVariable错误?_C#_Winforms_Listbox - Fatal编程技术网

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事件仅在句柄创建时发生,这非常令人沮丧。@LarsTech
RecreateHandle()
似乎有点开销,因为我在源代码中找不到任何关于项高度的信息(但它是一个较旧的),这应该在非托管代码中完成吗?如果你愿意,把你的话作为答案贴在周围。你可以删除该项目并将其插回。这触发了一个措施。