我正在将ListView中所有项目的ForeColor设置为不同的颜色,但是当项目被选中时,此设置被覆盖(再次变为黑色;取消选择时变回自定义颜色)。我想让我的项目保留我的自订色彩,即使在选取范围中。我基本上是在问7年前被问过的同一个问题,而且似乎没有任何满意的答案。我试着在SO和其他地方搜索,但没有运气。到目前为止提供的唯一解决方案是绘制整个东西(DrawItem方法),我试了一下,但对于这样一个微不足道的要求来说复杂得可笑...这是唯一的办法吗?说不是。
qlzsbp2j1#
启用ListView OwnerDraw模式,然后订阅其DrawItem和DrawColumnHeader事件。如果您的设计需要,也可以订阅DrawSubitem事件。此时,您可以在ListView的相关区域中绘制任何内容。在本例中,我在Header区域绘制了一个小符号。
OwnerDraw
DrawItem
DrawColumnHeader
DrawSubitem
页眉文本也需要绘制。
如果背景颜色没有改变(与设计模式相同),您只需要使用DrawListViewItemEventArgs e参数函数e.DrawBackground();如果没有,请使用e.Graphics.FillRectangle()为由e.Bounds定义的项目区域着色。使用e.Graphics.DrawString()绘制项目文本。项目Text为e.Item.Text,文本区域再次由e.Bounds定义。如果您不需要项目文字的任何特定详细数据/设定,只要使用**e.DrawText();即可,它会使用预设属性**(在设计阶段定义)。这里,项目颜色 * 复杂逻辑 * 是在项目文本中指定颜色。可以是任何其他东西。项目标签,它的索引位置,一个List<Parameters>,你可以命名它。它看起来可能是这样的:(我添加了e.Graphics.TextRenderingHint = []来显示如何控制呈现文本的质量。e.Graphics.TextContrast也可以用于增强对比度)。
DrawListViewItemEventArgs e
e.DrawBackground();
e.Graphics.FillRectangle()
e.Bounds
e.Graphics.DrawString()
e.Item.Text
e.DrawText();
List<Parameters>
e.Graphics.TextRenderingHint = []
e.Graphics.TextContrast
注意:如果ListView具有ImageList,则此代码示例仅绘制一般图像.您还应验证是否定义了SmallIcon/LargeIcon ImageList,并以指定得大小绘制相关得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); } }
1条答案
按热度按时间qlzsbp2j1#
启用ListView
OwnerDraw
模式,然后订阅其DrawItem
和DrawColumnHeader
事件。如果您的设计需要,也可以订阅
DrawSubitem
事件。此时,您可以在ListView的相关区域中绘制任何内容。
在本例中,我在Header区域绘制了一个小符号。
页眉文本也需要绘制。
如果背景颜色没有改变(与设计模式相同),您只需要使用
DrawListViewItemEventArgs e
参数函数e.DrawBackground();
如果没有,请使用
e.Graphics.FillRectangle()
为由e.Bounds
定义的项目区域着色。使用
e.Graphics.DrawString()
绘制项目文本。项目Text为
e.Item.Text
,文本区域再次由e.Bounds
定义。如果您不需要项目文字的任何特定详细数据/设定,只要使用**
e.DrawText();
即可,它会使用预设属性**(在设计阶段定义)。这里,项目颜色 * 复杂逻辑 * 是在项目文本中指定颜色。可以是任何其他东西。项目标签,它的索引位置,一个
List<Parameters>
,你可以命名它。它看起来可能是这样的:
(我添加了
e.Graphics.TextRenderingHint = []
来显示如何控制呈现文本的质量。e.Graphics.TextContrast
也可以用于增强对比度)。注意:如果ListView具有ImageList,则此代码示例仅绘制一般图像.您还应验证是否定义了SmallIcon/LargeIcon ImageList,并以指定得大小绘制相关得Image.但过程相同.