Как я могу изменить цвет линий сетки в WPF? - PullRequest
27 голосов
/ 03 марта 2009

У меня есть Grid (не DataGrid, а настоящая Grid), с GridLines, установленным на True. Как я могу изменить цвет линий сетки? С жестким кодом в XAML все в порядке, так как это только из соображений разработки.

<Grid ShowGridLines="True" />

Ответы [ 5 ]

35 голосов
/ 03 марта 2009

Извините, с ShowGridLines это сделать нельзя - вам нужно стилизовать содержащиеся в нем элементы.

Приложение A:

В документах MSDN сказано: «Доступны только пунктирные линии, потому что это свойство предназначено для отладки проблем компоновки и не предназначено для использования в рабочем коде качества. Если вы хотите, чтобы линии были внутри сетки, стилизуйте элементы внутри сетки иметь границы. "

Приложение B - Исходный код WPF:

Обратите внимание на Brushes.Blue и Brushes.Yellow, жестко запрограммированные в этом запечатанном внутреннем классе, который System.Windows.Controls.Grid использует для рисования линий.

Из сетки.

    /// <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(); 
        }
10 голосов
/ 03 июня 2012
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;
6 голосов
/ 06 января 2015

Этот ответ не о том, как на самом деле изменить GridLines, а о том, как сделать так, чтобы вы выглядели очень просто. Я уверен, что у других есть лучшие способы сделать это, но вот как я достиг, показывая мои линии сетки.

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

Создайте границу для ваших определений столбцов или определений сетки и установите для свойства Grid.Column любое значение. Затем вы можете установить свой цвет, толщину или стиль. Сладко и просто. Надеюсь, это поможет кому-то еще!

Вот изображение этой сетки:

enter image description here

0 голосов
/ 08 ноября 2017

Расширение ответа igalk474 , используется как:

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

...

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

Где local - локальная сборка, а FixedPage - любая 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);
        }

    }
}
0 голосов
/ 21 апреля 2011
<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>

Ссылка: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/0202b0dd-38d9-4ad7-8576-d115922aeeec/

...