C# 更改 ListView 项目/行的高度
我想更改列表视图中项目/行的高度。
我搜索了所有地方,我发现为了改变高度,我需要使用 LBS_OWNERDRAWFIXED 或 MeasureItem 或类似的东西。
问题是我不知道到底要做什么以及如何使用它..
有人可以帮我吗?
编辑:
我无法使用 ImageList hack,因为我实际使用的是 SmallImageList,并且我需要与 ImageList 图像大小不同的行高。
谢谢!
I want to change the Item's/Row's height in listview.
I searched every where and I figured that in order to change the height I need to use LBS_OWNERDRAWFIXED
or MeasureItem
or something like that.
The problem is that I dont know exactly what to do and how to use it..
Can anyone help me with it?
Edit:
I cant use the ImageList hack because I am using the SmallImageList for real and I need different line height from the ImageList images size.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
对于仍在为此苦苦挣扎的人,这是我使用的代码:
要使用它,只需执行以下操作:
For the people that are still struggling with this, here is the code I use:
To use this, just do:
你必须使用一些技巧。诀窍是在 StateImageList 属性中使用图像列表。 ListView 将根据 ImageList 的 ImageSize 属性的高度调整其项目高度。您不必为项目指定图像,但仅使用 StateImageList 将强制 ListView 进行调整。在下面的示例中,我将图像列表大小设置为 32x32,从而生成 32px 高度的 ListViewItem。
You have to use a bit of a hack. The trick is to use an image list in the StateImageList property. The ListView will adjust its item height, based on the height of the ImageList's ImageSize property. You do not have to specify an image for your items, but just using the StateImageList will force the ListView to adjust. In the example below, I had set the image list size to 32x32, thus resulting in a 32px height ListViewItem(s).
这可以使用
SmallImageList
技巧来完成 - 您只需小心即可。 ObjectListView——一个围绕标准 .NETListView
的开源包装器——使用了这个技巧成功实现RowHeight
属性。如果您希望每行 32 像素,请分配一个 16x32(宽 x 高)的
ImageList
,然后将每个图像放置在 32 像素高度的垂直中间。此屏幕截图显示 32 像素行以及由于额外空间而可能的自动换行:
< code>ObjectListView 为您完成所有这些工作。事实上,如果您尝试使用 ListView 执行任何操作,则应该认真考虑使用
ObjectListView
。它使许多困难的事情(例如按列类型排序、自定义工具提示)变得微不足道,并使一些不可能的事情(例如覆盖、虚拟列表上的组)成为可能。It can be done using the
SmallImageList
trick -- you just have to be careful. ObjectListView -- an open source wrapper around a standard .NETListView
-- uses that trick to successfully implement aRowHeight
property.If you want 32 pixels for each row, allocate an
ImageList
that is 16x32 (width x height), and then position each of your images in the vertical middle of the 32-pixel height.This screen shot shows 32-pixel rows and the word wrapping that is possible because of the extra space:
ObjectListView
does all this work for you. In fact, if you are trying to do anything with a ListView, you should seriously looked at using anObjectListView
instead. It makes many difficult things (e.g. sorting by column type, custom tooltips) trivial, and several impossible things (e.g. overlays, groups on virtual lists) possible.遗憾的是,这些年来没有人回答您最初的问题如何使用
LBS_OWNERDRAWFIXED
。您接受的答案是集成一个巨大的项目(带有演示和文档 3.3MB)。但仅仅为了设置 ListView 的行高,这就太过了。
此处建议的其他解决方法(添加 ImageList)仅适用于增加行高。但它不允许真正独立于图像高度设置 RowHeight。此外,默认行高取决于操作系统。例如,在 Windows 7 上,行数比 XP 上高得多。你不能选择让它们更紧,只能选择更高。
但只需很少的几行代码,您就可以做您想做的事情。
只需复制并粘贴以下类:
将 ListViewEx 添加到表单后,您将在 Visual Studio 表单设计器中看到一个新属性,该属性允许以像素为单位设置行高:
您输入的值将会有行高以像素为单位,并且在所有操作系统上都将严格遵守。我在 Windows XP、7 和 10 上测试了它:
此外,我的类比原始 ListView 还有两个优点:它绘制无闪烁并且尊重ForeColor 和 Font 在
ListViewSubItem
中设置,原始 Microsoft ListView 会忽略它们。所以你可以用不同的颜色和字体绘制每个单元格。重要:正如 MSDN 所说,
LBS_OWNERDRAWFIXED
是仅设计用于详细信息视图(报告视图)的。我的代码仅适用于这种模式,这是因为微软就是这样设计的。另外请注意,设置
ListView.OwnerDraw = true
与使用LVS_OWNERDRAWFIXED
完全不同。我没有实现绘制图标,因为我不需要它。但您可以轻松添加它。
Sadly nobody answered your original question how to use
LBS_OWNERDRAWFIXED
in all these years.The answer that you have accepted is integrating a huge project (with demos and documentation 3,3MB). But just for setting the line height of a ListView this is overbloated.
The other workaround suggested here (adding an ImageList) works only to increase the row height. But it does not allow to really set the RowHeight independent of the image height. Additionally the default row height depends on the operating system. For example on Windows 7 the rows are much higher than on XP. You cannot chose to make them tighter, only higher.
But with very few lines you can do what you want.
Just copy and paste the following class:
After adding a ListViewEx to your Form you will see a new property in the Visual Studio Forms Designer which allows to set the row height in pixels:
The value you enter there will be the row height in pixels and it will be respected exatctly on all operating systems. I tested it on Windows XP, 7 and 10:
Additionally my class has two more advantages over the original ListView: It draws flicker-free and it respects the ForeColor and Font set in
ListViewSubItem
which is ignored by the original Microsoft ListView. So you can draw each cell with a different color and font.IMPORTANT: As the MSDN says
LBS_OWNERDRAWFIXED
has been designed only for Details view (Report view). My code works only for this mode and this is because Microsoft has designed it like that.Additionally please note that setting
ListView.OwnerDraw = true
is a completely different thing than usingLVS_OWNERDRAWFIXED
.I did not implement drawing icons, because I don't need that. But you can easily add this.
ListView(在报表视图模式下)的默认行高是根据控件的字体大小计算的。
因此,要选择行高,请在 ListView 属性中选择具有正确高度的字体。
例如,选择 MS Sans Serif 18。
然后您可以更改所有项目使用的字体:
当您插入新项目时,设置其字体属性。
要优化字体分配,您应该将项目字体声明为表单的私有成员:
然后在添加项目时:
这个技巧是唯一允许具有较小行高的简单技巧;)
iE 将控件的字体大小设置为 7,并将项目的字体大小设置为 10。
(用VS 2008测试)
The default line height of a ListView (in report view mode) is computed based on the control's font size.
So to select the line height, choose a font with the right height in the ListView properties.
For example, select MS Sans Serif 18.
Then you can change the font used by all items:
when you insert a new item, set its font property.
To optimize font assignment you should declare the item font as a private member of the form:
Then when adding items :
This trick is the only easy one allowing to have SMALLER line height ;)
i.E. set control's font size to 7 and set items' font size to 10.
(Tested with VS 2008 )
Plasmabubble 的想法是正确的。这是对此的扩展,也是我用来为项目使用窄线宽的方法。
ListView 中的行距取决于 ListView 的字体并且无法更改。但是,您可以将 ListView 中的项目的字体设置为大于 ListView 的字体。
如果您希望它成比例,请根据项目的字体创建字体。
无论选择什么字体,我希望项目高度为正常高度的 90%。
当我填充列表时,我使用了设置中存储的字体,但您也可以使用“Consolas”等文字字体。
Plasmabubble has the right idea. This expands on that and is what I use to use a narrow line-width for the items.
The linespacing in a ListView is dependent on the ListView's font and can't be changed. However, you can set the font for the items in the ListView to something larger than the ListView's font.
If you want it to be proportional, create a font based on the item's font.
I want the item height to be 90% of normal, whatever the font chosen.
When I populate the list I used a font stored in settings but you could also use a literal font like "Consolas".
看了这么多年的答案,一是使用基于ListView的扩展控件,二是使用字体或者图标进行扩展。
如果您的项目已经使用 ListView - 就像我的情况一样,您需要在保持原始图标和字体大小的同时扩展列高 - 我建议
你可以粗略计算出你需要的列高,以及正常图标大小的比例,从而使用透明边框来扩展图标大小,例如如果24x24图标实际上是35高,你可以使用windows Paint 3D来扩展使用画布将图标调整为35x35以保持图标的原始比例,我认为这可能是最节省时间和成本的方法。
After reading the answers for so many years, one is to use ListView based extension controls and the other is to use fonts or icons for extensions.
If your project already uses a ListView -- as in my case, where you need to extend the column height while keeping the original icon and font size -- I suggest
You can roughly calculate the column height you need, and the ratio of the normal icon size, and thus use the transparent border to extend the icon size, e.g. if the 24x24 icon is actually 35 in height, you can use windows paint 3D to extend the icon to 35x35 using the canvas to keep the original ratio of the icon, I think this is probably the most time and cost effective way.