C# 更改ListView标题和网格线颜色
我有一个windows窗体应用程序,我在其中添加了两个ListView,以便为用户保存一些数据,看起来是这样的 正如您所看到的,我的表单背景颜色是黑色的,因此列表视图的网格线和标题白色形成了令人讨厌的对比,因此在一个小时的搜索后,我决定在这里询问C# 更改ListView标题和网格线颜色,c#,winforms,C#,Winforms,我有一个windows窗体应用程序,我在其中添加了两个ListView,以便为用户保存一些数据,看起来是这样的 正如您所看到的,我的表单背景颜色是黑色的,因此列表视图的网格线和标题白色形成了令人讨厌的对比,因此在一个小时的搜索后,我决定在这里询问 [问题]:如何编辑列表视图标题和网格线的颜色以满足我的需要?您可以在DataGrid中执行此操作,但我认为ListView没有简单的方法,因为与DataGrid不同,这些线没有属性 <Style TargetType="{x:Type Data
[问题]:如何编辑列表视图标题和网格线的颜色以满足我的需要?您可以在DataGrid中执行此操作,但我认为ListView没有简单的方法,因为与DataGrid不同,这些线没有属性
<Style TargetType="{x:Type DataGrid}">
<Setter Property="HorizontalGridLinesBrush" Value="Red"/>
<Setter Property="VerticalGridLinesBrush" Value="Green"/>
</Style>
将其放入应用程序资源或窗口资源中
除此之外,还有一种方法可以更改每个ListViewItem的边框颜色:
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="BorderBrush" Value="Red"/>
</Style>
似乎没有人对自定义
列表视图
以支持网格线颜色
感兴趣。我试过这个,想在这里分享。当您滚动ListView项时,稍微闪烁一下(不是太多),这不是很好。不过这是可以接受的。我想我在这里缺乏一些关于win32的知识来让它更完美:
public class CustomListView : ListView {
bool scrollDown;
int lastScroll;
public Color GridLinesColor {get;set;}
[DllImport("user32")]
private static extern int GetScrollPos(IntPtr hwnd, int nBar);
public CustomListView(){
GridLinesColor = Color.Red;
DoubleBuffered = true;
base.GridLines = false;//We should prevent the default drawing of gridlines.
}
public new bool GridLines {get;set;}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x20a){//WM_MOUSEWHEEL = 0x20a
scrollDown = (m.WParam.ToInt64() >> 16) < 0;
}
if (m.Msg == 0x115){//WM_VSCROLL = 0x115
int n = (m.WParam.ToInt32() >> 16);
scrollDown = n > lastScroll;
lastScroll = n;
}
base.WndProc(ref m);
if (m.Msg == 0xf && GridLines && Items.Count > 0&&View==View.Details)//WM_PAINT = 0xf
{
using (Graphics g = CreateGraphics())
{
using(Pen p = new Pen(GridLinesColor)){
int w = -GetScrollPos(Handle, 0);
for (int i = 0; i < Columns.Count; i++)
{
w += Columns[i].Width;
g.DrawLine(p, new Point(w, 0), new Point(w, ClientSize.Height));
}
int a = Items[0].Bounds.Bottom - 1;
int b = Height - Items[0].Bounds.Y;
int c = Items[0].Bounds.Height;
for (int i = scrollDown ? a + (b/c) * c : a ; scrollDown ? i >= a : i < b ; i += scrollDown ? -c : c)
{
g.DrawLine(p, new Point(0, i), new Point(ClientSize.Width, i));
}
}
}
}
}
}
公共类CustomListView:ListView{
bool向下滚动;
最后一卷;
公共颜色网格线颜色{get;set;}
[DllImport(“user32”)]
私有静态外部int GetScrollPos(IntPtr hwnd,int nBar);
公共CustomListView(){
GridLinesColor=Color.Red;
双缓冲=真;
base.GridLines=false;//我们应该防止默认绘制网格线。
}
公共新布尔网格线{get;set;}
受保护的覆盖无效WndProc(参考消息m)
{
如果(m.Msg==0x20a){//WM_鼠标轮=0x20a
scrollDown=(m.WParam.ToInt64()>>16)<0;
}
如果(m.Msg==0x115){//WM_VSCROLL=0x115
int n=(m.WParam.ToInt32()>>16);
scrollDown=n>lastScroll;
lastcoll=n;
}
基准WndProc(参考m);
如果(m.Msg==0xf&&GridLines&&Items.Count>0&&View==View.Details)//WM\u PAINT=0xf
{
使用(Graphics g=CreateGraphics())
{
使用(画笔p=新画笔(网格线颜色)){
intw=-GetScrollPos(句柄,0);
for(int i=0;iGetScrollPos
,因为根据MSDN文档页面的建议,我们应该使用GetScrollInfo
这可能吗?还是这个@RenniePet:对不起,你能看到你提供的两个主题都与我的问题相去甚远吗?。一个用于decexpress,另一个只解决标题颜色的问题,那么这些网格线呢?我也不能更改为其他任何内容,因为我的整个代码都构建在listview上,所以我需要对listview进行修复。没有其他选项。我的问题没有答案?gridlines属性仅用于设置它们是否可见。。。但是它没有提供我最需要的任何颜色调整选项。@Nobbacode其他的东西都很好,但是它没有解决我最大的问题,那就是网格的颜色lines@DanialEugen除非重写某些内容(请参阅本文):(第二篇文章),否则无法使用默认类执行此操作。您也可以考虑GRIDVIEW:非常感谢您的帮助+ 1,实际上是试图解决被问及的问题,即使在一个无用的答案已经被接受。我不能让它在我的WinForms虚拟机上闪烁(Win7,有无Aero)。但是代码还有一些其他的大问题。其中之一是没有实现的水平滚动,结果很难看。此外,由于未能调用Dispose,您正在泄漏笔对象。通过将创建内容包装到using语句中,您甚至可以重复使用同一笔对象,并将其自动处置。我不明白你为什么需要跟踪
下滚状态。@CodyGray谢谢你的建议,事实上这只是演示。需要向下滚动
,以便我们知道如果用户向下滚动,我们将从底部
到顶部
绘制行
,否则(向上滚动)我们将从顶部
到底部
。它减少了一点闪烁(事实上,这不是闪烁,它是由绘制默认的白线
引起的)。如果没有问题,我可以将接受的答案更改为最佳答案,但是如果代码已满,我会这样做,以便将来任何人都可以从我的线程中受益。