2013-08-17 19 views
7

Beh Ho un'applicazione Windows Form in cui aggiungo un paio di listviews al fine di contenere alcuni dati per l'utente e sembra che questoModifica ListView Header e la griglia di colori

enter image description here

Come si vedere il mio modulo backcolor è nero, quindi le linee della griglia della lista di visualizzazione e il colore dell'intestazione bianca rendono un contrasto noioso, quindi dopo un'ora di ricerca senza fortuna ho deciso di chiedere qui.

[Domanda]: In che modo è possibile modificare i colori dell'intestazione & Linee griglia della vista elenco per soddisfare le mie esigenze?

+1

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

+0

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

+1

@RenniePet: mi scusi ma puoi vedere che entrambi gli argomenti hai fornito sono lontani dalla mia domanda? uno per decexpress e l'altro risolve solo il problema del colore Header, che dire di quelle linee della griglia? –

risposta

-1

È possibile eseguire ciò in un DataGrid, ma non credo che ci sia un modo semplice per ListView, dal momento che non ci sono proprietà per tali linee, a differenza di DataGrid.

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

Inserirlo nelle risorse dell'applicazione o nelle risorse finestra.

Oltre a questo, c'è un modo per cambiare il colore del bordo di ogni ListViewItem:

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

La proprietà griglia è solo per stabilire se sono visibili o meno ... Tuttavia non fornisce alcuna opzione di regolazione del colore di cui ho più bisogno. –

+0

@Nobbacode Il resto delle cose è buono ma non risolve il mio problema più grande che è il colore delle linee della griglia –

+0

@DanialEugen Non è possibile farlo con la classe predefinita a meno che non si sovrascriva alcune cose (fare riferimento a questo): http : //www.hightechtalks.com/dotnet-framework-winforms-controls/color-grid-listview-539463.html (2 ° post). Puoi anche considerare GridView: http://stackoverflow.com/questions/461404/c-sharp-how-do-i-change-the-gridlines-color-in-windows-forms-listview –

6

Sembra che non ci sia nessuno che sia interessato a personalizzare un ListView per sostenere Grid Line Color. Ho provato questo e voglio condividere qui. Non è molto buono con un piccolo sfarfallio (non molto) quando si scorrono gli oggetti di ListView. Comunque è accettabile. Penso che mi manca un po 'di conoscenza della win32 qui per renderlo più perfetto:

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: Grazie al suggerimento di Cody Grey, ho aggiunto il codice per gestire lo scorrimento orizzontale. Io uso GetScrollPos per semplicità perché, come raccomandato dalla pagina di documentazione MSDN, dovremmo usare invece GetScrollInfo.

enter image description here

+0

+1 per tentare effettivamente una soluzione alla domanda che viene posta, anche dopo che una risposta inutile era già stata accettata. Non riesco a farlo sfarfallare sul mio WinForms VM (Win 7, con e senza Aero). Ma ci sono altri grossi problemi con il codice. Uno di questi è lo scorrimento orizzontale, che non è implementato e l'effetto risultante è brutto.Inoltre, stai perdendo oggetti penna non riuscendo a chiamare Dispose. Racchiudendo la creazione in un'istruzione using, è possibile riutilizzare lo stesso oggetto penna * e * averlo disposto automaticamente. E non capisco perché è necessario tenere traccia dello stato 'scrollDown'. –

+0

@CodyGray grazie per il tuo suggerimento, infatti questa è solo una dimostrazione. è necessario 'scrollDown' per sapere se l'utente scorre verso il basso, disegneremo le' Lines' da 'Bottom' a' Top', altrimenti (scorrere verso l'alto) disegneremo le 'Lines' da' Top' a 'Bottom'. Riduce un po 'di sfarfallio (in effetti non è uno sfarfallio, è causato dal disegno di 'linee bianche' predefinite.) –

+1

Posso cambiare la risposta accettata per essere la migliore risposta, purché non ci siano problemi, comunque lo farò se il codice è completo, in modo che chiunque possa beneficiare della mia discussione in futuro. –

Problemi correlati