启用您的 ListView OwnerDraw 模式,然后订阅其 DrawItem 和 DrawColumnHeader 事件。
如果您的设计需要,也可以订阅DrawSubitem 活动。
此时,您可以在 ListView 的相关区域中绘制任何内容。
在示例中,我在页眉区域绘制了一个小符号。
标题文本也需要绘制。
如果背景颜色没有变化(和设计模式一样),你只需要使用DrawListViewItemEventArgs e参数函数e.DrawBackground();
如果不是,请使用e.Graphics.FillRectangle() 为由e.Bounds 定义的项目区域着色。
项目文本是使用e.Graphics.DrawString()绘制的。
项目文本为e.Item.Text,文本区域再次由e.Bounds定义。
如果您不需要项目文本的任何特定细节/设置,您可以简单地使用 e.DrawText();,它使用 默认属性(在设计时定义) .
这里,项目颜色复杂的逻辑是在项目文本内部指定颜色。可以是别的什么。项目标签,它的索引位置,List<Parameters>,你可以命名它。
这可能是这样的:
(我添加了e.Graphics.TextRenderingHint = [] 来展示如何控制渲染文本的质量。e.Graphics.TextContrast 也可以用来增强对比度)。
注意:如果 ListView 具有 ImageList,则此代码示例仅绘制通用图像。您还应该验证是否定义了 SmallIcon/LargeIcon ImageLists,并以指定的大小绘制相关的 Image。不过,这是相同的程序。
protected void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
e.Item.UseItemStyleForSubItems = true;
int imageOffset = 0;
Rectangle rect = e.Item.Bounds;
bool drawImage = !(e.Item.ImageList is null);
Color itemColor = Color.FromName(e.Item.Text.Substring(e.Item.Text.LastIndexOf(" ") + 1));
using (var format = new StringFormat(StringFormatFlags.FitBlackBox)) {
format.LineAlignment = StringAlignment.Center;
if (drawImage) {
imageOffset = e.Item.ImageList.ImageSize.Width + 1;
rect.Location = new Point(e.Bounds.X + imageOffset, e.Item.Bounds.Y);
rect.Size = new Size(e.Bounds.Width - imageOffset, e.Item.Bounds.Height);
e.Graphics.DrawImage(e.Item.ImageList.Images[e.Item.ImageIndex], e.Bounds.Location);
}
if (e.Item.Selected) {
using (var bkgrBrush = new SolidBrush(itemColor))
using (var foreBrush = new SolidBrush(e.Item.BackColor)) {
e.Graphics.FillRectangle(bkgrBrush, rect);
e.Graphics.DrawString(e.Item.Text, e.Item.Font, foreBrush, rect, format);
}
e.DrawFocusRectangle();
}
else {
//e.DrawDefault = true;
using (var foreBrush = new SolidBrush(itemColor)) {
e.Graphics.DrawString(e.Item.Text, e.Item.Font, foreBrush, rect, format);
}
}
}
}
// Draws small symbol in the Header beside the normal Text
protected void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
e.DrawBackground();
string extra = (e.ColumnIndex == 1) ? (char)32 + "\u2660" + (char)32 : (char)32 + "\u2663" + (char)32;
using (var brush = new SolidBrush(e.ForeColor)) {
e.Graphics.DrawString(extra + e.Header.Text, e.Font, brush, e.Bounds, StringFormat.GenericTypographic);
}
}