C# 如何在整个DataGrid列标题周围添加边框?
我已经定制了很多C# 如何在整个DataGrid列标题周围添加边框?,c#,.net,wpf,xaml,wpfdatagrid,C#,.net,Wpf,Xaml,Wpfdatagrid,我已经定制了很多DataGrid,但令人惊讶的是,我无法在整个页眉区域周围添加边框而不破坏它 这就是我想要实现的目标: 以下控件负责显示标题区域:DataGridColumnHeadersPresenter 我在它周围添加了一个边框,正如您从上面的屏幕截图中看到的,它确实有效,但问题只有在网格为空时才会出现(这意味着也需要删除空行,可以通过设置CanUserAddRows=“False”)来完成 到目前为止,我的风格如下: <Border BorderBrush="Red" Border
DataGrid
,但令人惊讶的是,我无法在整个页眉区域周围添加边框而不破坏它
这就是我想要实现的目标:
以下控件负责显示标题区域:DataGridColumnHeadersPresenter
我在它周围添加了一个边框,正如您从上面的屏幕截图中看到的,它确实有效,但问题只有在网格为空时才会出现(这意味着也需要删除空行,可以通过设置CanUserAddRows=“False”
)来完成
到目前为止,我的风格如下:
<Border BorderBrush="Red" BorderThickness="1" Grid.Column="1">
<DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" Margin="0,0,0,5"
Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}">
</DataGridColumnHeadersPresenter>
</Border>
如果我给DataGridColumnHeader
一个BorderBrush
和BorderThickness
,它看起来不正确,如果我在任何地方添加自己的边界控件,同样的问题也会出现
DataGridColumnHeadersPresenter
实际上具有BorderBrush
和BorderThickness
属性,但它们根本没有任何效果
我发现的一个解决方法是将Grid.Column
设置为0
,这样它就代替了行标题和列标题,然后只需在DataGrid
上设置HeadersVisibility=“Column”
,这样它看起来就不会损坏,问题就消失了。不幸的是,我需要行标题,所以这是一个不可接受的解决方案
可以找到DataGrid的默认样式,或者在VisualStudio中右键单击它,转到“编辑模板”,然后编辑一个副本,这就是我所做的
必须有一种简单的方法来实现这一点,而我现在可能还没有看到…好吧,所以在@jsanalytics指出存在
DataGridHeaderBorder
之后,我返回来解决这个问题,通过更深入地分析默认树结构,并进行一些尝试和错误,我设法把工作做完了
不过,我不想要作为Windows主题的一部分的DataGridHeaderOrder
,而是将其替换为常规边框
我的实施:
<DataGridColumnHeadersPresenter Grid.Column="1" x:Name="PART_ColumnHeadersPresenter"
Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}">
<DataGridColumnHeadersPresenter.Template>
<ControlTemplate TargetType="{x:Type DataGridColumnHeadersPresenter}">
<Grid HorizontalAlignment="Left">
<ItemsPresenter />
<DataGridColumnHeader x:Name="PART_FillerColumnHeader" IsHitTestVisible="False">
<DataGridColumnHeader.Template>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Grid>
<Border BorderThickness="2" BorderBrush="Red">
<ContentPresenter RecognizesAccessKey="True"
SnapsToDevicePixels="True" />
</Border>
<!--Uncomment if you need these resizing grippers-->
<!--<Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" />
<Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" />-->
</Grid>
</ControlTemplate>
</DataGridColumnHeader.Template>
</DataGridColumnHeader>
</Grid>
</ControlTemplate>
</DataGridColumnHeadersPresenter.Template>
</DataGridColumnHeadersPresenter>
您可能需要根据自己的需要对其进行调整,但这满足了我们的要求:-)边框应该添加到
DataGridColumnHeadersPresenter
的模板中@jsanalytics它之所以有效是因为您有一个空行,请尝试通过设置CanUserAddRows=“False”
来删除它,然后看看会发生什么。@ShahinDohan您会发布相关代码吗?在这种情况下,还需要访问DataGridHeaderBorder
内部datagridcolumnheaderpresenter
。我的意思是说DataGridHeaderOrder
insideDataGridColumnHeader
insideDataGridColumnHeaderPresenter
。
<DataGridColumnHeadersPresenter Grid.Column="1" x:Name="PART_ColumnHeadersPresenter"
Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}">
<DataGridColumnHeadersPresenter.Template>
<ControlTemplate TargetType="{x:Type DataGridColumnHeadersPresenter}">
<Grid HorizontalAlignment="Left">
<ItemsPresenter />
<DataGridColumnHeader x:Name="PART_FillerColumnHeader" IsHitTestVisible="False">
<DataGridColumnHeader.Template>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Grid>
<Border BorderThickness="2" BorderBrush="Red">
<ContentPresenter RecognizesAccessKey="True"
SnapsToDevicePixels="True" />
</Border>
<!--Uncomment if you need these resizing grippers-->
<!--<Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" />
<Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" />-->
</Grid>
</ControlTemplate>
</DataGridColumnHeader.Template>
</DataGridColumnHeader>
</Grid>
</ControlTemplate>
</DataGridColumnHeadersPresenter.Template>
</DataGridColumnHeadersPresenter>