C# Winform Listview背景绘制问题
题
我对列表视图有一个小问题。
我可以使用 listview 项目加载它,但是当我设置背景颜色时,它不会将颜色一直绘制到行的左侧 [listViewItems 加载 ListViewSubItems 以制作网格视图,仅第一列显示错误]。有一条窄条不上漆。如果我有一个行标题,该条带的宽度与行标题大致相同。
如果您有关于如何制作背景绘制的想法,我很想听听。
现在,为了尝试一个新想法,我为第一个解决方案提供十票赏金,该解决方案仍然让我使用这个糟糕的伪网格视图的混乱结构。[我喜欢遗留代码。]
编辑:
这是展示该问题的示例。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ListView lv = new ListView();
lv.Dock = System.Windows.Forms.DockStyle.Fill;
lv.FullRowSelect = true;
lv.GridLines = true;
lv.HideSelection = false;
lv.Location = new System.Drawing.Point(0, 0);
lv.TabIndex = 0;
lv.View = System.Windows.Forms.View.Details;
lv.AllowColumnReorder = true;
this.Controls.Add(lv);
lv.MultiSelect = true;
ColumnHeader ch = new ColumnHeader();
ch.Name = "Foo";
ch.Text = "Foo";
ch.Width = 40;
ch.TextAlign = HorizontalAlignment.Left;
lv.Columns.Add(ch);
ColumnHeader ch2 = new ColumnHeader();
ch.Name = "Bar";
ch.Text = "Bar";
ch.Width = 40;
ch.TextAlign = HorizontalAlignment.Left;
lv.Columns.Add(ch2);
lv.BeginUpdate();
for (int i = 0; i < 3; i++)
{
ListViewItem lvi = new ListViewItem("1", "2");
lvi.BackColor = Color.Black;
lvi.ForeColor = Color.White;
lv.Items.Add(lvi);
}
lv.EndUpdate();
}
}
解决方案
啊!我现在明白了 :}
你想要哈克吗?我向您介绍以下内容:
...
lv.OwnerDraw = true;
lv.DrawItem += new DrawListViewItemEventHandler( lv_DrawItem );
...
void lv_DrawItem( object sender, DrawListViewItemEventArgs e )
{
Rectangle foo = e.Bounds;
foo.Offset( -10, 0 );
e.Graphics.FillRectangle( new SolidBrush( e.Item.BackColor ), foo );
e.DrawDefault = true;
}
对于更有创意且同样老套的方法,您可以尝试利用 ListView 的背景图像;)
其他提示
(在编辑之前...)
我刚刚尝试在 System.Windows.Forms.ListView 上设置 BackColor,并且颜色很好地应用于整个控件(有图像和没有图像)。
您在做定制绘画吗?
好的,我正在添加一些额外的解决方案注释。如果您使用上面的解决方案,您还需要为列标题插入绘制处理程序,否则它们将无法绘制。所选项目矩形看起来也很有趣,因此您需要在 lv_DrawItem 函数中检查它并实现类似的解决方案。请记住,突出显示是在系统级别而不是在您的应用程序中选择的。
更好的列表视图 (并且免费 更好的 ListView Express)允许使用各种对齐设置(居中、平铺、拉伸、适合、对齐边框/角)设置背景图像。还支持 Alpha 透明度:
不隶属于 StackOverflow