我有一个使用自定义单元格颜色的列表视图,但是当我在列表视图中设置背景图像时,自定义单元格颜色将不再出现。我试图暂时删除背景图像(组装列表时)并在应用单元格颜色后恢复它。这导致没有自定义颜色,但显示背景。如果可能的话,我想结合这两个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图像,但这也显然不起作用。
答案 0 :(得分:2)
您有两种选择:
Panel
或PictureBox
。要使其工作,您必须使其位于ListView内部,以便它是叠加层的Parent
。 但这会使Listview
不可点击。 - 另一个问题是它会略微为文本着色,所以看起来不太正确。
ListView
设置为OwnerDraw = true
并添加代码以自行完成绘图。 这是一个非滚动和滚动的示例:
请注意,原始的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
和真实的背景图像。它们都与色单元一起使用。