如何在整个DataGrid列标题周围添加边框?

时间:2018-10-25 15:01:48

标签: c# .net wpf xaml wpfdatagrid

我已经自定义了DataGrid了很多,但是令人惊讶的是,我无法在整个标题区域周围添加边框而不破坏它。

这就是我要完成的事情:

Pretty simple right?

以下控件负责显示标题区域: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>

我所做的只是用边框包裹起来,但是现在当我应用过滤以使网格为空时,标题消失在右侧,并且应用程序减慢了爬行速度。

演示:

demonstration

如果我移除边框,一切都会按预期进行。看来DataGrid期望一个非常特定的树结构,否则它只会爆炸。

我尝试更改DataGridColumnHeadersPresenter的模板,但也期望使用一个非常特殊的结构,如下所示:

<DataGridColumnHeadersPresenter.Template>
    <ControlTemplate TargetType="{x:Type DataGridColumnHeadersPresenter}">
        <Grid>
            <DataGridColumnHeader x:Name="PART_FillerColumnHeader"
                                  IsHitTestVisible="False" />
            <ItemsPresenter />
        </Grid>
    </ControlTemplate>
</DataGridColumnHeadersPresenter.Template>

如果我给DataGridColumnHeader一个BorderBrushBorderThickness,它看起来不正确,并且如果我在任何地方添加自己的边界控件,都会出现相同的问题。

DataGridColumnHeadersPresenter实际上具有BorderBrushBorderThickness属性,但是它们根本没有作用。

我发现一种解决方法是将Grid.Column设置为0,以便代替行标题列标题,然后在HeadersVisibility="Column"上设置DataGrid它看起来没有坏,问题消失了。不幸的是,我需要行标题,所以这是不可接受的解决方案。

可以找到here用于DataGrid的默认样式,或者只需在Visual Studio中右键单击它,然后转到“编辑模板”,然后单击“编辑副本”即可。

必须有一种简单的方法来完成此操作,而我现在可能只是看不到...

1 个答案:

答案 0 :(得分:-1)

好吧,所以在@jsanalytics指出存在DataGridHeaderBorder之后,我回到了解决这个问题的位置,并且通过更深入地分析默认树结构,并进行了一些尝试和错误,我设法完成了工作完成。

尽管我不希望DataGridHeaderBorder(它是Windows主题的一部分),但将其替换为常规边框。

我的实现:

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

您可能需要根据自己的需要进行调整,但这符合我们的要求:-)