2009-03-03 14 views
26

Ich habe eine Grid (kein DataGrid, aber ein echtes Grid), mit GridLines auf True festgelegt. Wie kann ich die Farbe der Gitternetzlinien ändern? Hardcoded in XAML ist in Ordnung, da es nur aus Entwicklungsgründen ist.Wie kann ich die Farbe der Gitterlinien eines Gitters in WPF ändern?

<Grid ShowGridLines="True" /> 
+1

Meinst du ein Grid oder ein DataGrid? Ich sehe keine GridLines-Eigenschaft im Grid. – Andy

+2

Grid, nicht DataGrid. – Natrium

Antwort

35

kann leider nicht mit Showgridlines getan werden - Sie müssen enthalten, die Elemente stylen.

Exhibit A:

MSDN docs sagen: „Nur gepunktete Linien verfügbar sind, da diese Eigenschaft als Design-Tool zum Debuggen von Layout-Problemen gedacht und ist nicht für den Einsatz in Produktionsqualität Code bestimmt Wenn Sie Linien wollen. Innerhalb eines Rasters formt die Elemente innerhalb des Rasters so, dass sie Ränder haben. "

Exhibit B - The Source Code WPF:

Hinweis der Brushes.Blue Brushes.Yellow und in dieser hartcodierte abgedichtete interne Klasse, die System.Windows.Controls.Grid die Linien zu zeichnen, verwendet.

Von 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

Ich wünschte, es wäre so einfach. Aber es ist für ** DataGrid ** und nicht ** Grid ** ... – surfen

+6

Lustig. Das hat mir wirklich geholfen, weil ich nach DataGrid gesucht habe. – 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

Danke +1. wäre nicht der Gedanke, das zu tun. Mit Reflektion können Sie die Tatsache umgehen, dass die Klasse intern ist? –

+0

Wenn Sie beide Stifte auf orange stellen, fällt es ziemlich einfach auf die Augen :) – EricG

5

Diese Antwort ist nicht, wie eigentlich die Gitternetzlinien zu ändern, aber wie man es so aussehen, wie Sie in einem tat sehr einfache Art und Weise. Ich bin mir sicher, dass andere bessere Möglichkeiten haben, dies zu tun, aber hier habe ich meine Gitterlinien gezeigt.

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

Erstellen Sie eine Grenze für Ihre Spaltendefinitionen oder Gitterdefinitionen und stellen Sie die Grid.Column Eigenschaft auf, was auch immer Sie wollen. Dann können Sie Ihre Farbe, Dicke oder Stil einstellen. Süß und einfach. Hoffe das hilft jemand anderem! Hier

ist ein Bild dieses Gitters:

enter image description here

0

Eine Erweiterung igalk474's answer, als:

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

... 

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

local Wo die lokale Montage ist, und FixedPage ist jede 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); 
     } 

    } 
} 
Verwandte Themen