Как добавить рамку вокруг всего заголовка столбца DataGrid? - PullRequest
0 голосов
/ 25 октября 2018

Я настроил 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 a BorderBrush и BorderThickness, это выглядит неправильно, и если я добавляю свой собственный пограничный контроль где-либо, возникает та же проблема.

На самом деле DataGridColumnHeadersPresenter имеет свойства BorderBrush и BorderThickness, но они никак не влияют.

Один из найденных мной обходных путей - установить Grid.Column на 0, поэтомучто он идет вместо заголовка столбца заголовков строк, затем просто установите HeadersVisibility="Column" на DataGrid, чтобы он не выглядел неработающим, и проблема исчезла.К сожалению, мне нужны заголовки строк, так что это неприемлемое решение.

Стиль по умолчанию для DataGrid можно найти здесь , или просто щелкните его правой кнопкой мыши в Visual Studio и перейдите в Редактировать шаблон,затем отредактируйте копию, что я и сделал.

Должен быть простой способ сделать это, которого я, вероятно, просто сейчас не вижу ...

1 Ответ

0 голосов
/ 31 октября 2018

Хорошо, поэтому я только что вернулся к решению этой проблемы после того, как @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>

Возможно, вам придется настроить его под свои нужды, но это отвечает нашим требованиям: -)

...