ListView与背景图像和自定义单元格颜色

时间:2015-05-17 02:27:41

标签: c# winforms listview background listviewitem

我有一个使用自定义单元格颜色的列表视图,但是当我在列表视图中设置背景图像时,自定义单元格颜色将不再出现。我试图暂时删除背景图像(组装列表时)并在应用单元格颜色后恢复它。这导致没有自定义颜色,但显示背景。如果可能的话,我想结合这两个listview属性。

我设置/删除背景图片的代码:

list.BackgroundImage = Properties.Resources.bgalpha;
list.BackgroundImage = null;

我设置自定义单元格颜色的代码的一部分:

for (int i = 0; i < kavels.Count(); i++ )
{
    if (list.Items[i].SubItems[1].Text != "0")
    {
        list.Items[i].UseItemStyleForSubItems = false;
        list.Items[i].SubItems[1].BackColor = Color.LightGreen;
    }
}

以下是两个屏幕截图:

列出具有背景的视图:http://i.imgur.com/aHUXAVh.png

没有背景的列表视图:http://i.imgur.com/sO83wTP.png

我还尝试制作一个带有透明背景的PictureBox以及一个在ListView顶部具有透明度的png图像,但这也显然不起作用。

2 个答案:

答案 0 :(得分:2)

您有两种选择:

  • 您可以使用半转化图片覆盖PanelPictureBox。要使其工作,您必须使其位于ListView内部,以便它是叠加层的Parent

但这会使Listview 不可点击。 - 另一个问题是它会略微为文本着色,所以看起来不太正确。

  • 或者您可以将ListView设置为OwnerDraw = true并添加代码以自行完成绘图。

这是一个非滚动和滚动的示例:

enter image description here enter image description here

请注意,原始的BackgroundImage会透过右侧的空间。

如果您在详细信息模式下绘制ListView,则需要对事件进行编码以绘制子项和标题;注意用于保存itemHeight的类级变量;这假设它们都具有相同的高度..另一个需要水平滚动。

int itemHeight = 0;  // we need this number!
int itemLeft = 0;    // we need this number, too

private void listView1_DrawColumnHeader(object sender,
                                        DrawListViewColumnHeaderEventArgs e)
{
    Rectangle R0 = listView1.GetItemRect(0);
    itemHeight = R0.Height;   // we need this number!
    itemLeft = R0.Left;       // we need this number too

    e.DrawBackground();
    e.DrawText();
}

private void listView1_DrawSubItem(object sender,
                                   DrawListViewSubItemEventArgs e)
{
    Rectangle rrr = listView1.GetItemRect(e.ItemIndex);
    Rectangle rect = e.Bounds;
    Rectangle rect0 = new Rectangle(rect.X - itemLeft , itemHeight * e.ItemIndex,
                                    rect.Width, rect.Height);
    Image img = listView1.BackgroundImage;
    e.Graphics.DrawImage(img, rect, rect0, GraphicsUnit.Pixel);
    using (SolidBrush brush = new SolidBrush(e.SubItem.BackColor))
        e.Graphics.FillRectangle(brush, rect);
    e.DrawText();
}

以下是为示例设置ListViewItem lvi中颜色的代码:

lvi.UseItemStyleForSubItems = false;
lvi.BackColor = Color.FromArgb(66, Color.LightBlue);
lvi.SubItems[1].BackColor = Color.FromArgb(77, Color.LightGreen);
lvi.SubItems[2].BackColor = Color.FromArgb(88, Color.LightPink);

请注意,代码假定您的背景为一个大图片,并且涉及无平铺!此外,只有您没有

时,代码才有效

答案 1 :(得分:0)

ObjectListView - 围绕标准.NET ListView的开源包装器 - 提供ImageOverlays和真实的背景图像。它们都与色单元一起使用。

Translucent overlaid images