2013-08-17 236 views
7

嗯,我有一個Windows窗體應用程序中,我添加幾個列表視圖,以保存一些數據對用戶和它看起來像這樣更改的ListView頭和網格線顏色

enter image description here

正如你看到我的表單背景顏色是黑色的,所以列表視圖的網格線和標題白色會產生惱人的對比,所以經過一小時搜索而沒有運氣,我決定在這裏問問。

[問題]:我如何編輯列表視圖的網格線&的顏色以符合我的需求?

+1

這也許? http://stackoverflow.com/questions/1814692/change-the-background-color-of-winform-listview-headers – RenniePet

+0

或者這個? http://stackoverflow.com/questions/6008226/are-there-any-good-and-free-devexpress-data-grid-alternatives-for-winforms – RenniePet

+1

@RenniePet:對不起,但你能看到這兩個主題你提供的遠離我的問題嗎?一個用於decexpress,另一個只解決Header顏色的問題,那些網格線呢? –

回答

-1

您可以在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> 
+0

網格線屬性只能設置它們是否可見或不可以......但它不提供任何我最需要的顏色調整選項。 –

+0

@Nobbacode其餘的東西都很好,但它並沒有解決我最大的問題,那就是網格線的顏色 –

+0

@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 –

6

它看起來像沒有任何人誰的興趣來定製一個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

enter image description here

+0

+1,以便實際嘗試解決所問問題的解決方案,即使在無用答案已被接受之後。我無法讓我的WinForms虛擬機閃爍(Win 7,有和沒有Aero)。但是代碼還有一些其他的大問題。其中之一是水平滾動 - 沒有實施,導致的效果是醜陋的。此外,您通過未調用Dispose而泄漏Pen對象。通過將創建包裝在使用語句中,您甚至可以重複使用相同的筆對象*和*自動處理它。我不明白你爲什麼需要跟蹤'scrollDown'狀態。 –

+0

@CodyGray感謝您的建議,實際上這只是演示。 'scrollDown'是必需的,以便我們知道用戶是否向下滾動,我們將'Lines'從'Bottom'繪製到'Top',否則(向上滾動),我們將從'Top'繪製'Lines'到'Bottom'。它減少了一些閃爍(實際上這不是閃爍,這是由於繪製了默認的「白線」造成的。) –

+1

我可以將接受的答案改爲最好的答案,但前提是沒有問題,但是我會這麼做如果代碼已滿,任何人都可以從我的線程中受益。 –