2009-03-03 30 views
26

Mam Grid (nie DataGrid, ale prawdziwa siatka), z GridLines ustawiona na True. Jak mogę zmienić kolor linii siatki? Zakodowane na stałe w XAML jest ok, ponieważ jest to tylko z powodów związanych z rozwojem.Jak mogę zmienić kolor linii siatki siatki w WPF?

<Grid ShowGridLines="True" /> 
+1

Masz na myśli Grid lub DataGrid? Nie widzę właściwości GridLines w Grid. – Andy

+2

Siatka, a nie DataGrid. – Natrium

Odpowiedz

35

Niestety, nie można tego zrobić przy pomocy ShowGridLines - musisz stylizować zawarte w nich elementy.

Exhibit A:

MSDN docs powiedzieć „Tylko linie przerywane są dostępne, ponieważ ta właściwość ma służyć jako narzędzie do projektowania problemów układu debugowania i nie jest przeznaczony do stosowania w kodzie jakości produkcji Jeśli chcesz linie. wewnątrz siatki, styl elementów w sieci, aby mieć granice. "

Załącznik B - WPF kod źródłowy:

Zawiadomienie Brushes.Blue i Brushes.Yellow zakodowane w tym szczelnie klasy wewnętrznej, która wykorzystuje System.Windows.Controls.Grid zwrócić linii.

Od Grid.cs

/// <summary> 
    /// Helper to render grid lines. 
    /// </summary> 
    internal class GridLinesRenderer : DrawingVisual 
    { 
     /// <summary> 
     /// Static initialization 
     /// </summary> 
     static GridLinesRenderer() 
     { 
      s_oddDashPen = new Pen(Brushes.Blue, c_penWidth); 
      DoubleCollection oddDashArray = new DoubleCollection(); 
      oddDashArray.Add(c_dashLength); 
      oddDashArray.Add(c_dashLength); 
      s_oddDashPen.DashStyle = new DashStyle(oddDashArray, 0); 
      s_oddDashPen.DashCap = PenLineCap.Flat; 
      s_oddDashPen.Freeze(); 

      s_evenDashPen = new Pen(Brushes.Yellow, c_penWidth); 
      DoubleCollection evenDashArray = new DoubleCollection(); 
      evenDashArray.Add(c_dashLength); 
      evenDashArray.Add(c_dashLength); 
      s_evenDashPen.DashStyle = new DashStyle(evenDashArray, c_dashLength); 
      s_evenDashPen.DashCap = PenLineCap.Flat; 
      s_evenDashPen.Freeze(); 
     } 
0
<Window.Resources> 
    <SolidColorBrush x:Key="RedGridLine" Color="#FFFF4444" /> 
    <SolidColorBrush x:Key="BlueGridLine" Color="#554444FF"/> 
</Window.Resources> 

<my:DataGrid VerticalGridLinesBrush="{StaticResource RedGridLine}" 
     HorizontalGridLinesBrush="{StaticResource BlueGridLine}" > 
... 
</my:DataGrid> 

Ref: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/0202b0dd-38d9-4ad7-8576-d115922aeeec/

+4

Chciałbym, żeby to było takie proste. Ale dla ** DataGrid **, a nie ** Grid ** ... – surfen

+6

Śmieszne. Pomogło mi to, ponieważ szukałem DataGrid. – dotNET

9
var T = Type.GetType("System.Windows.Controls.Grid+GridLinesRenderer," + 
    " PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); 

var GLR = Activator.CreateInstance(T); 
GLR.GetType().GetField("s_oddDashPen", BindingFlags.Static | BindingFlags.NonPublic).SetValue(GLR, new Pen(Brushes.Black, 1.0)); 
GLR.GetType().GetField("s_evenDashPen", BindingFlags.Static | BindingFlags.NonPublic).SetValue(GLR, new Pen(Brushes.Black, 1.0)); 

myGrid.ShowGridLines = true; 
+0

Dzięki +1. nie pomyślałaby o tym. Korzystając z refleksji można przejść przez fakt, że klasa jest wewnętrzna? –

+0

Jeśli ustawisz oba pióra na pomarańczowe, okaże się to całkiem łatwe w oczach :) – EricG

5

Ta odpowiedź nie jest, jak faktycznie zmienić kratek, ale w jaki sposób, aby wyglądał jak ty w sposób bardzo prosty sposób. Jestem pewien, że inni mają lepsze sposoby, aby to zrobić, ale oto jak udało mi się pokazać moje linie siatki.

<Grid Height="115" Margin="0,0,0,0" ShowGridLines="False"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="220"/> 
            <ColumnDefinition Width="220"/> 
            <ColumnDefinition Width="200*"/> 
           </Grid.ColumnDefinitions> 
           <Border Grid.Column="0" BorderBrush="White" BorderThickness="1"> 
           </Border> 
           <Border Grid.Column="1" BorderBrush="White" BorderThickness="1">      
           </Border> 
           <Border Grid.Column="2" BorderBrush="White" BorderThickness="1">   
           </Border> 
          </Grid> 

Utwórz obramowanie dla definicji kolumn lub definicji siatek i ustaw właściwość Grid.Column na dowolne. Następnie możesz ustawić swój kolor, grubość lub styl. Słodki i prosty. Mam nadzieję, że to pomoże komuś innemu!

Oto obraz tej siatki:

enter image description here

0

Przedłużenie igalk474's answer, wykorzystywane jako:

<FixedPage.Resources> 
    <local:GridLinesRenderer x:Key="glr" StrokeColor="Black" StrokeWidth="1.0" /> 
</FixedPage.Resources> 

... 

<Grid ShowGridLines="True"> 
... 
</Grid> 

Gdzie local jest lokalny zespół, a FixedPage jakakolwiek FrameworkElement.

using System; 
using System.Reflection; 
using System.Windows; 
using System.Windows.Media; 

namespace mynamespace.xaml { 
    public class GridLinesRenderer : DependencyObject { 

     public static readonly DependencyProperty StrokeWidthProperty = DependencyProperty.Register(
      "StrokeWidth", typeof(double), typeof(GridLinesRenderer), new PropertyMetadata(1.0, OnPropertyChanged) 
     ); 

     public static readonly DependencyProperty StrokeColorProperty = DependencyProperty.Register(
      "StrokeColor", typeof(SolidColorBrush), typeof(GridLinesRenderer), new PropertyMetadata(Brushes.Black, OnPropertyChanged) 
     ); 

     public double StrokeWidth { 
      get { return (double)GetValue(StrokeWidthProperty); } 
      set { SetValue(StrokeWidthProperty, value); } 
     } 

     public SolidColorBrush StrokeColor { 
      get { return (SolidColorBrush)GetValue(StrokeColorProperty); } 
      set { SetValue(StrokeColorProperty, value); } 
     } 

     public GridLinesRenderer() { 
      OnPropertyChanged(this, new DependencyPropertyChangedEventArgs()); 
     } 

     private static void OnPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) { 
      Type T = Type.GetType("System.Windows.Controls.Grid+GridLinesRenderer," + 
       "PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); 
      var glr = Activator.CreateInstance(T); 
      Pen glrPen = new Pen(((GridLinesRenderer)source).StrokeColor, ((GridLinesRenderer)source).StrokeWidth); 
      glr.GetType().GetField("s_oddDashPen", BindingFlags.Static | BindingFlags.NonPublic).SetValue(glr, glrPen); 
      glr.GetType().GetField("s_evenDashPen", BindingFlags.Static | BindingFlags.NonPublic).SetValue(glr, glrPen); 
     } 

    } 
} 
Powiązane problemy