【发布时间】:2011-08-15 14:23:41
【问题描述】:
我正在使用 ListView 组件在我的程序中显示一些保存的配置文件,每个配置文件都有一个图标和一个标题。所以我使用了 View 属性设置为 Tile 的 ListView(也应用了分组)
我不想添加一些关于条目的描述文本(不是工具提示)。我可以像 Windows Explorer 那样做吗?
【问题讨论】:
我正在使用 ListView 组件在我的程序中显示一些保存的配置文件,每个配置文件都有一个图标和一个标题。所以我使用了 View 属性设置为 Tile 的 ListView(也应用了分组)
我不想添加一些关于条目的描述文本(不是工具提示)。我可以像 Windows Explorer 那样做吗?
【问题讨论】:
您可能需要定义列标题。来自documentation:
平铺视图显示每个项目 左侧有一个大图标和文字 右边的信息。文字的 信息由项目标签组成 其次是子项目。默认情况下,仅 显示第一个子项,其中 对应项目标签。到 显示其他子项,您必须 将
ColumnHeader对象添加到Columns收藏。中的每个子项 瓦片对应于一列 标题。控制哪些子项是 显示和它们的顺序 显示,您必须设置ListViewItem.ListViewSubItem.Name每个项目的属性和ColumnHeader.Name每个属性 标题。然后,您可以添加、删除和 重新排列Columns中的标题 收集达到预期 结果。
【讨论】:
我不确定这是否会完全符合您的要求,因为我只测试过它没有任何图标,但它会在 ListView 处于平铺模式时写入子项。
首先将 ListView 上的 OwnerDraw 设置为 true,然后将此函数添加到其 DrawItem 事件中:
private void statisticsView_DrawItem(object sender,
DrawListViewItemEventArgs e)
{
e.Graphics.FillRectangle(Brushes.White, e.Bounds);
if((e.State & ListViewItemStates.Selected) != 0)
e.DrawFocusRectangle();
Rectangle bounds = e.Bounds;
Font font = ((ListView)sender).Font;
Font nameFont = new Font(font.FontFamily,
font.Size,
FontStyle.Underline | FontStyle.Bold,
font.Unit,
font.GdiCharSet,
font.GdiVerticalFont);
using(StringFormat sf = new StringFormat())
{
e.Graphics.DrawString(e.Item.SubItems[0].Text,
nameFont, Brushes.Black, bounds, sf);
bounds.Y += 17;
for(int i = 1; i < e.Item.SubItems.Count; ++i, bounds.Y += 15)
e.Graphics.DrawString(e.Item.SubItems[i].Text,
font, Brushes.Black, bounds, sf);
}
}
首先它用白色背景颜色填充瓷砖,如果瓷砖被选中,它会在其周围绘制一个选择矩形。下一部分只是采用 ListView 上设置的字体并创建一个重复的字体并进行一些更改。最后,它绘制每个子项,同时在每个子项之后将绘图矩形向下移动 15 个像素。第一个子项使用单独的字体绘制,比其余子项高 17 个像素。
您应该能够修改代码以满足您的需要。
【讨论】: