Как изменить цвет линий сетки в WPF?
У меня есть Grid
(а не DataGrid, но реальная сетка), с GridLines
установлено значение True
. Как изменить цвет линий сетки?
Жестко закодировано в XAML в порядке, так как оно предназначено только для целей разработки.
<Grid ShowGridLines="True" />
Ответы
Ответ 1
Извините, не может быть сделано с ShowGridLines - вам нужно стилизовать содержащиеся элементы.
Иллюстрация A:
MSDN docs говорят: "Доступны только пунктирные линии, потому что это свойство предназначено как средство разработки для отладки макетов и не предназначено для использования в коде качества продукции. Если вы хотите, чтобы строки внутри Grid, стиль элементов в Grid иметь границы".
Иллюстрация B - Исходный код WPF:
Обратите внимание на Brushes.Blue и Brushes.Yellow, жестко закодированные в этом закрытом внутреннем классе, который использует System.Windows.Controls.Grid для рисования строк.
Из 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();
}
Ответ 2
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;
Ответ 3
Этот ответ заключается не в том, как на самом деле изменить 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]()
Ответ 4
<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/
Ответ 5
Расширение ответа 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);
}
}
}