2009-03-03 36 views
26

Tôi có một Grid (không phải là DataGrid, nhưng là Lưới thực), với GridLines được đặt thành True. Làm cách nào để thay đổi màu của đường lưới? Được mã hóa bằng XAML là ok, vì nó chỉ vì lý do phát triển.Làm cách nào để thay đổi màu của đường lưới của lưới trong WPF?

<Grid ShowGridLines="True" /> 
+1

Bạn có nghĩa là Lưới hoặc DataGrid không? Tôi không thấy thuộc tính GridLines trên Grid. – Andy

+2

Lưới, không phải DataGrid. – Natrium

Trả lời

35

Xin lỗi, không thể thực hiện với ShowGridLines - bạn cần tạo kiểu cho các thành phần chứa.

lục A:

MSDN tài liệu nói "Chỉ đường chấm có sẵn vì tài sản này được thiết kế như một công cụ thiết kế cho những vấn đề bố trí debug và không có ý định để sử dụng trong mã chất lượng sản xuất Nếu bạn muốn dòng. bên trong lưới, tạo kiểu cho các phần tử trong lưới để có đường viền. "

Phụ lục B - Các WPF Mã Nguồn:

Thông báo các Brushes.Blue và Brushes.Yellow mã hóa cứng trong này kín lớp nội bộ mà System.Windows.Controls.Grid sử dụng để vẽ dòng.

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

Tôi ước nó rất đơn giản. Nhưng nó dành cho ** DataGrid ** và không ** Grid ** ... – surfen

+6

Vui nhộn. Điều này thực sự đã giúp tôi becuz Tôi đã tìm kiếm 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

Cảm ơn +1. sẽ không nghĩ đến việc đó. Bằng cách sử dụng sự phản chiếu, bạn có thể vượt qua thực tế là lớp học là nội bộ? –

+0

Nếu bạn đặt cả hai bút thành màu cam, nó sẽ trở nên khá dễ dàng trên mắt :) – EricG

5

Câu trả lời này không phải là làm thế nào để thực sự thay đổi các đường lưới, nhưng làm thế nào để làm cho nó trông giống như bạn đã làm trong một rất đơn giản. Tôi chắc chắn những người khác có cách tốt hơn để làm điều này, nhưng đây là cách tôi thực hiện hiển thị đường lưới của tôi.

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

Tạo đường viền cho định nghĩa cột hoặc định nghĩa lưới và đặt thuộc tính Grid.Column thành bất kỳ thứ gì bạn muốn. Sau đó, bạn có thể đặt màu, độ dày hoặc kiểu của bạn. Ngọt ngào và đơn giản. Hy vọng điều này sẽ giúp người khác!

Dưới đây là hình ảnh của lưới này:

enter image description here

0

Một phần mở rộng của igalk474's answer, sử dụng như:

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

... 

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

đâu local là hội đồng địa phương, và FixedPage là bất kỳ 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); 
     } 

    } 
} 
Các vấn đề liên quan