2013-08-17 17 views
7

Dobrze Mam aplikacji Windows Forms, w której dodaję parę listViews w celu przeprowadzenia niektórych danych dla użytkownika i wygląda na toZmiana ListView nagłówek i linii siatki kolory

enter image description here

jak ty zobacz mój formularz kolor tła jest czarny, więc linie siatki widoku listy i biały kolor nagłówka stanowią irytujący kontrast, więc po godzinie szukania bez szczęścia postanowiłem zapytać tutaj.

[Pytanie]: Jak mogę edytować kolory linii nagłówka & w widoku listy w celu dopasowania do moich potrzeb?

+1

to może być? http://stackoverflow.com/questions/1814692/change-the-background-color-of-winform-listview-headers – RenniePet

+0

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

+1

@RenniePet: przepraszam, ale czy widzisz, że oba tematy podane przez ciebie są dalekie od mojego pytania? jeden dla decexpresji i drugi tylko rozwiązuje problem koloru nagłówka, a co z liniami siatki? –

Odpowiedz

-1

Możesz to zrobić w DataGrid, ale nie sądzę, że istnieje łatwy sposób na ListView, ponieważ nie ma właściwości dla tych linii, w przeciwieństwie do DataGrid.

<Style TargetType="{x:Type DataGrid}"> 
    <Setter Property="HorizontalGridLinesBrush" Value="Red"/> 
    <Setter Property="VerticalGridLinesBrush" Value="Green"/> 
</Style> 

Umieść go w zasobach aplikacji lub zasobach okna.

Poza tym, istnieje sposób, aby zmienić kolor obramowania każdej ListViewItem:

<Style TargetType="{x:Type ListViewItem}"> 
    <Setter Property="BorderBrush" Value="Red"/> 
</Style> 
+0

Właściwość linie siatki służy tylko do określenia, czy są widoczne, czy nie ... Jednak nie zapewnia żadnych opcji dopasowania kolorów, które najbardziej mi odpowiadają. –

+0

@Nobbacode Reszta rzeczy jest dobra, jednak nie rozwiązuje mojego największego problemu jakim jest kolor linii siatki –

+0

@DanialEugen Nie możesz tego zrobić z domyślną klasą, chyba że przesłonisz niektóre rzeczy (zobacz:) : //www.hightechtalks.com/dotnet-framework-winforms-controls/color-grid-listview-539463.html (drugi post). Możesz również rozważyć GridView: http://stackoverflow.com/questions/461404/c-sharp-how-do-i-change-the-gridlines-color-in-windows-forms-listview –

6

Wygląda na to, że nie ma nikogo, kto jest zainteresowany dostosowywania ListView wspierać Grid Line Color. Spróbowałem tego i chcę się nim podzielić. Nie jest to dobre dzięki niewielkiemu migotaniu (niezbyt dużo) podczas przewijania elementów ListView. Jednak jest to do przyjęcia. Chyba brakuje pewnej wiedzy o win32 tutaj, aby uczynić go bardziej idealne:

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: Dzięki sugestii Cody Grey I dodaje kod do obsługi przewijania w poziomie. Używam GetScrollPos dla uproszczenia, ponieważ zgodnie z zaleceniami ze strony dokumentacji MSDN, powinniśmy użyć zamiast tego GetScrollInfo.

enter image description here

+0

+1 za rzeczywiste rozwiązanie problemu, nawet po tym, jak bezużyteczna odpowiedź została już zaakceptowana. Nie mogę zmusić tego do migotania na mojej maszynie WinForms VM (Win 7, zi bez Aero). Ale są też inne poważne problemy z kodem. Jednym z nich jest przewijanie w poziomie - to nie jest realizowane, a wynikowy efekt jest brzydki.Ponadto, przeciekasz obiekty Pen, nie wywołując Dispose. Przez zawijanie kreacji w instrukcji użycia można nawet ponownie użyć tego samego obiektu pióra * i * automatycznie go usunąć. I nie rozumiem, dlaczego musisz śledzić stan 'scrollDown'. –

+0

@CodyGray dziękuję za sugestię, w rzeczywistości jest to tylko wersja demo. "scrollDown" jest wymagany, abyśmy wiedzieli, że jeśli użytkownik przewinie w dół, narysujemy 'Lines' od' Bottom' do 'Top', w przeciwnym razie (przewiń w górę) narysujemy' Lines' od 'Top' do 'Dół'. Zmniejsza nieznaczne migotanie (w rzeczywistości nie jest to migotanie, jest spowodowane rysowaniem domyślnych "białych linii"). –

+1

Mogę zmienić zaakceptowaną odpowiedź, aby była najlepszą odpowiedzią pod warunkiem, że nie ma problemu, jednak zrobię to jeśli kod jest pełny, aby każdy mógł skorzystać z mojego wątku w przyszłości. –

Powiązane problemy