嗯,我有一個Windows窗體應用程序中,我添加幾個列表視圖,以保存一些數據對用戶和它看起來像這樣更改的ListView頭和網格線顏色
正如你看到我的表單背景顏色是黑色的,所以列表視圖的網格線和標題白色會產生惱人的對比,所以經過一小時搜索而沒有運氣,我決定在這裏問問。
[問題]:我如何編輯列表視圖的網格線&的顏色以符合我的需求?
嗯,我有一個Windows窗體應用程序中,我添加幾個列表視圖,以保存一些數據對用戶和它看起來像這樣更改的ListView頭和網格線顏色
正如你看到我的表單背景顏色是黑色的,所以列表視圖的網格線和標題白色會產生惱人的對比,所以經過一小時搜索而沒有運氣,我決定在這裏問問。
[問題]:我如何編輯列表視圖的網格線&的顏色以符合我的需求?
您可以在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>
網格線屬性只能設置它們是否可見或不可以......但它不提供任何我最需要的顏色調整選項。 –
@Nobbacode其餘的東西都很好,但它並沒有解決我最大的問題,那就是網格線的顏色 –
@DanialEugen除非你重寫一些東西(參考這裏),否則你不能用默認類來做:http ://www.hightechtalks.com/dotnet-framework-winforms-controls/color-grid-listview-539463.html(第二篇文章)。您也可以考慮使用GridView:http://stackoverflow.com/questions/461404/c-sharp-how-do-i-change-the-gridlines-color-in-windows-forms-listview –
它看起來像沒有任何人誰的興趣來定製一個ListView
支持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));
}
}
}
}
}
}
UPDATE:由於科迪灰色的建議下,我添加代碼來處理水平滾動。爲簡單起見,我使用GetScrollPos
,因爲按照MSDN文檔頁面的建議,我們應該使用GetScrollInfo
。
+1,以便實際嘗試解決所問問題的解決方案,即使在無用答案已被接受之後。我無法讓我的WinForms虛擬機閃爍(Win 7,有和沒有Aero)。但是代碼還有一些其他的大問題。其中之一是水平滾動 - 沒有實施,導致的效果是醜陋的。此外,您通過未調用Dispose而泄漏Pen對象。通過將創建包裝在使用語句中,您甚至可以重複使用相同的筆對象*和*自動處理它。我不明白你爲什麼需要跟蹤'scrollDown'狀態。 –
@CodyGray感謝您的建議,實際上這只是演示。 'scrollDown'是必需的,以便我們知道用戶是否向下滾動,我們將'Lines'從'Bottom'繪製到'Top',否則(向上滾動),我們將從'Top'繪製'Lines'到'Bottom'。它減少了一些閃爍(實際上這不是閃爍,這是由於繪製了默認的「白線」造成的。) –
我可以將接受的答案改爲最好的答案,但前提是沒有問題,但是我會這麼做如果代碼已滿,任何人都可以從我的線程中受益。 –
這也許? http://stackoverflow.com/questions/1814692/change-the-background-color-of-winform-listview-headers – RenniePet
或者這個? http://stackoverflow.com/questions/6008226/are-there-any-good-and-free-devexpress-data-grid-alternatives-for-winforms – RenniePet
@RenniePet:對不起,但你能看到這兩個主題你提供的遠離我的問題嗎?一個用於decexpress,另一個只解決Header顏色的問題,那些網格線呢? –