仅一列的特殊网格线样式

时间:2011-01-19 16:01:40

标签: wpf datagrid gridlines

如何在DataGrid的一列上设置自定义网格线样式?特别是,我希望一列有一条双线作为左边界。

示例:

| Col1 | Col2 || Col3 (w/ Double Left Border) |

谢谢你,

2 个答案:

答案 0 :(得分:4)

这取决于你想要这条双线的位置。垂直GridLines在OnRender中为DataGridCell绘制,水平GridLines在OnRender中为DataGridCellsPresenter绘制。然而,DataGridColumnHeader的边界更复杂。它是RenderThemeDataGridHeaderBorder方法中绘制的矩形,我认为没有直接的方法来改变其宽度而不重新模仿整个DataGridColumnHeader。此外,Headers的边框粗细厚度是DataGrid中的单元格的两倍(1px vs 2px),因为Headers在两侧都绘制了分隔符。

因此,要获得仅影响单元格的双线粗细,您可以在要应用的位置添加特殊的DataGridCell样式。所有这些单元格样式都是以与GridLines相同的颜色向左绘制1px边框。它看起来像这样

alt text

<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做了类似的事情,那么你将失去排序箭头,鼠标悬停效果,mousedown效果等等,所以你必须为它创建一个完整的模板

答案 1 :(得分:0)

这是我最终做的事情:

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

这是基于Meleak的答案,但是添加了边距(创建双线效果)并使用RelativeSource作为边框画笔,无需使用DataGrid来获得x:Name。