WinForms:更改ListView中选定项的ForeColor

tjvv9vkg  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(149)

我正在将ListView中所有项目的ForeColor设置为不同的颜色,但是当项目被选中时,此设置被覆盖(再次变为黑色;取消选择时变回自定义颜色)。
我想让我的项目保留我的自订色彩,即使在选取范围中。
我基本上是在问7年前被问过的同一个问题,而且似乎没有任何满意的答案。
我试着在SO和其他地方搜索,但没有运气。到目前为止提供的唯一解决方案是绘制整个东西(DrawItem方法),我试了一下,但对于这样一个微不足道的要求来说复杂得可笑...
这是唯一的办法吗?说不是。

qlzsbp2j

qlzsbp2j1#

启用ListView OwnerDraw模式,然后订阅其DrawItemDrawColumnHeader事件。
如果您的设计需要,也可以订阅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.但过程相同.

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);
    }
}

相关问题