Как установить собственный стиль линии сетки только для одного столбца Сетка данных? В частности, я хотел бы, чтобы один столбец имел двойную линию в качестве левой границы.
Пример:
| Col1 | Col2 || Col3 (w/ Double Left Border) |
Спасибо,
Бен
Как установить собственный стиль линии сетки только для одного столбца Сетка данных? В частности, я хотел бы, чтобы один столбец имел двойную линию в качестве левой границы.
Пример:
| Col1 | Col2 || Col3 (w/ Double Left Border) |
Спасибо,
Бен
Это зависит от того, где вы хотите эту двойную линию. Вертикальные GridLines рисуются в OnRender
для DataGridCell
, а горизонтальные GridLines рисуются в OnRender
для DataGridCellsPresenter
. Однако граница для DataGridColumnHeader
более сложная. Это прямоугольник, нарисованный методом RenderTheme
в DataGridHeaderBorder
, и я не думаю, что есть прямой способ изменить его ширину без повторного создания шаблона всего DataGridColumnHeader
. Кроме того, толщина границы для заголовков в два раза больше толщины ячеек в DataGrid
для начала (1 пиксель против 2 пикселей), потому что заголовки рисуют свои разделители с обеих сторон.
Итак, чтобы получить двойную толщину линии, которая влияет только на ячейки, вы можете добавить специальный стиль DataGridCell
, где вы хотите применить это. Все, что делает этот стиль ячейки, — рисует границу в 1 пиксель слева того же цвета, что и GridLines. Это будет выглядеть примерно так
<DataGrid ...
HorizontalGridLinesBrush="Black">
<DataGrid.Resources>
<Style x:Key="DoubleLeftBorderCell" TargetType="DataGridCell">
<Setter Property="BorderThickness" Value="1,0,0,0"/>
<Setter Property="BorderBrush" Value="{Binding ElementName=dataGrid, Path=HorizontalGridLinesBrush}"/>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Double left Border"
CellStyle="{StaticResource DoubleLeftBorderCell}"
Binding="{Binding TextProperty}"/>
</DataGrid.Columns>
</DataGrid>
В ячейках нет эффекта наведения мыши или чего-то еще, о чем нужно беспокоиться. Однако, если вы сделаете что-то подобное для DataGridColumnHeader
, вы потеряете стрелки сортировки, эффект наведения мыши, эффект наведения мыши и т. д., поэтому вам придется создать для него целый шаблон.
Вот что я в итоге сделал:
<DataGridTextColumn Header="Header Name">
<DataGridTextColumn.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Margin" Value="1 0 0 0" />
<Setter Property="BorderThickness" Value="1 0 0 0" />
<Setter Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=HorizontalGridLinesBrush}" />
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
Это основано на ответе Мелеака, но с добавлением поля (для создания эффекта двойной линии) и использованием RelativeSource для кисти границы, что устраняет необходимость в том, чтобы DataGrid имел x: Name.