代码之家  ›  专栏  ›  技术社区  ›  Shahin Dohan

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

  •  1
  • Shahin Dohan  · 技术社区  · 6 年前

    我已经定制了 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.Template>
        <ControlTemplate TargetType="{x:Type DataGridColumnHeadersPresenter}">
            <Grid>
                <DataGridColumnHeader x:Name="PART_FillerColumnHeader"
                                      IsHitTestVisible="False" />
                <ItemsPresenter />
            </Grid>
        </ControlTemplate>
    </DataGridColumnHeadersPresenter.Template>
    

    如果我给你 DataGridColumnHeader BorderBrush BorderThickness

    实际上有 边缘刷 边界厚度 属性,但它们没有任何效果。

    我找到的一个解决办法是 Grid.Column 0 这样它就代替了行标题和列标题,然后设置 HeadersVisibility="Column" 这样看起来就不会坏,问题就消失了。不幸的是,我需要行标题,所以这是一个不可接受的解决方案。

    可以找到DataGrid的默认样式 here ,或者在VisualStudio中右键单击它并转到“编辑模板”,然后编辑一个副本,这就是我所做的。

    必须有一个简单的方法来完成这一点,我可能只是没有看到现在。。。

    1 回复  |  直到 6 年前
        1
  •  -1
  •   Shahin Dohan    6 年前

    好吧,在@jsanalytics指出了这个问题的存在之后,我回来解决这个问题 DataGridHeaderBorder

    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>