2009-03-03 15 views
26

Tengo un Grid (no una cuadrícula de datos, pero una cuadrícula real), con GridLines conjunto de True. ¿Cómo puedo cambiar el color de las líneas de la cuadrícula? codificado en XAML es aceptable, ya que es sólo por razones de desarrollo-.¿Cómo se puede cambiar el color de las líneas de división de una red en WPF?

<Grid ShowGridLines="True" /> 
+1

Qué quiere decir una cuadrícula, o una cuadrícula de datos? No veo una propiedad GridLines en Grid. – Andy

+2

Cuadrícula, no DataGrid. – Natrium

Respuesta

35

Lo sentimos, no se puede hacer con ShowGridLines; debe estilizar los elementos que contiene.

Prueba A:

documentos MSDN dicen "Solamente líneas de puntos están disponibles porque esta propiedad está pensado como una herramienta de diseño para problemas de diseño de depuración y no está destinado para su uso en el código de calidad de la producción Si desea que las líneas. dentro de una Grilla, modele los elementos dentro de la Grilla para que tengan bordes ".

Anexo B - El código fuente de WPF:

Aviso del Brushes.Blue y Brushes.Yellow codificadas de forma rígida en este sellados clase interna que System.Windows.Controls.Grid utiliza para dibujar las líneas.

De 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

Ojalá fuera tan simple. Pero es para ** ** cuadrícula de datos, y no ** ** cuadrícula ... – surfen

+6

divertido. Esto realmente me ayudó porque estaba buscando 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

Gracias +1. no hubiera pensado en hacer eso. Mediante el uso de la reflexión que puede pasar por el hecho de que la clase es interna? –

+0

Si configura ambas plumas en naranja, resulta bastante fácil :) – EricG

5

Esta respuesta no es cómo cambiar realmente las líneas de división, pero la forma de hacer que se vea como lo hizo en una forma muy simple. Estoy seguro de que otros tienen mejores formas de hacerlo, pero así es como logré mostrar mis líneas de cuadrícula.

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

crear un borde para sus definiciones de columna o definiciones de cuadrícula y establezca la propiedad Grid.Column a lo que usted desea. Luego puede establecer su color, grosor o estilo. Dulce y simple. ¡Espero que esto ayude a alguien más!

Aquí es una imagen de esta rejilla:

enter image description here

0

Una extensión de igalk474's answer, usado como:

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

... 

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

Dónde local es la asamblea local, y FixedPage es cualquier 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); 
     } 

    } 
} 
Cuestiones relacionadas