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
inside
DataGridColumnHeader
inside
DataGridColumnHeaderPresenter
<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>