我已经自定义了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>
我所做的只是用边框包裹起来,但是现在当我应用过滤以使网格为空时,标题消失在右侧,并且应用程序减慢了爬行速度。
演示:
如果我移除边框,一切都会按预期进行。看来DataGrid期望一个非常特定的树结构,否则它只会爆炸。
我尝试更改DataGridColumnHeadersPresenter
的模板,但也期望使用一个非常特殊的结构,如下所示:
<DataGridColumnHeadersPresenter.Template>
<ControlTemplate TargetType="{x:Type DataGridColumnHeadersPresenter}">
<Grid>
<DataGridColumnHeader x:Name="PART_FillerColumnHeader"
IsHitTestVisible="False" />
<ItemsPresenter />
</Grid>
</ControlTemplate>
</DataGridColumnHeadersPresenter.Template>
如果我给DataGridColumnHeader
一个BorderBrush
和BorderThickness
,它看起来不正确,并且如果我在任何地方添加自己的边界控件,都会出现相同的问题。
DataGridColumnHeadersPresenter
实际上具有BorderBrush
和BorderThickness
属性,但是它们根本没有作用。
我发现一种解决方法是将Grid.Column
设置为0
,以便代替行标题列标题,然后在HeadersVisibility="Column"
上设置DataGrid
它看起来没有坏,问题消失了。不幸的是,我需要行标题,所以这是不可接受的解决方案。
可以找到here用于DataGrid的默认样式,或者只需在Visual Studio中右键单击它,然后转到“编辑模板”,然后单击“编辑副本”即可。
必须有一种简单的方法来完成此操作,而我现在可能只是看不到...
答案 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>
您可能需要根据自己的需要进行调整,但这符合我们的要求:-)