In a Windows.Forms.ListBox
与财产DrawMode
set to OwnerDrawVariable
, the ListBox
好像缓存了物品的高度,有什么好处。
但是,项目高度取决于宽度,因为它使用Graphics.MeasureString
要进行自动换行,需要计算项目的高度(如果项目的大小)ListBox
已经改变。那么有一个问题。
The ListBox
默认情况下不这样做,而且我找不到清除缓存的方法,强制ListBox
引发 itemheight 事件。
有什么解决办法吗?我试图获取 ListBox 的源代码,但没有找到任何有关创建派生类并清除此缓存的信息。
(尝试将项目复制到数组中,清除ListBox.Items
,然后再次添加数组。这甚至会抛出异常ListBox
使用无效的项目索引调用drawitem或itemheight事件)
根据this MSDN
LB_SETITEMHEIGHT 消息
设置列表框中项目的高度(以像素为单位)。如果列表框有LBS_OWNERDRAWVARIABLEstyle,此消息设置项目的高度
由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);
}
}
The MeasureItemEventArgs
接受一个Graphics
对象,如有必要,从控件创建一个对象并将其传递到第一个参数中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)