好吧,我有一个 Windows 窗体应用程序,我在其中添加了几个 listViews 以便为用户保存一些数据,它看起来像这样
如您所见,我的表单背景颜色为黑色,因此列表视图的网格线和标题白色形成了令人讨厌的对比,因此在没有运气的情况下进行了一个小时的搜索后,我决定在这里提问。
[问题]:如何编辑列表视图的标题和网格线的颜色以满足我的需要?
似乎没有人有兴趣定制 aListView
来支持Grid Line Color
. 我试过这个,想在这里分享。当您滚动 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));
}
}
}
}
}
}
更新:感谢 Cody Gray 的建议,我添加了处理水平滚动的代码。为了简单起见,我使用它GetScrollPos
,因为按照 MSDN 文档页面的建议,我们应该使用它GetScrollInfo
。
您可以在 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>