Создать разделитель столбцов DataGrid - PullRequest
5 голосов
/ 26 июля 2011

Есть ли способ создать визуальный разделитель между двумя конкретными столбцами в DataGrid?Это не должно быть причудливо, может быть, просто двойная линия или более толстая граница.

Ответы [ 3 ]

5 голосов
/ 09 января 2014

В случае, если это что-то вроде этого

enter image description here

Вы можете достичь с помощью пользовательского стиля:

<Window.Resources>
    <Style x:Key="DataGridColumnSeparatorStyle" TargetType="DataGridCell">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Fill="Gray"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<DataGrid x:Name="dataGrid" AutoGenerateColumns="False">        
    <DataGrid.Columns>
        <DataGridTextColumn Header="Start"/>
        <DataGridTextColumn Header="End"/>
        <!-- Separator column -->
        <DataGridTemplateColumn MinWidth="0" Width="2" CellStyle="{StaticResource DataGridColumnSeparatorStyle}"/>
        <DataGridTextColumn Header="Start"/>
        <DataGridTextColumn Header="End"/>
    </DataGrid.Columns>
</DataGrid>

Если вы генерируете столбцы в коде позадилибо путем автоматического создания столбцов, либо по-другому, вы все равно можете создать столбец-разделитель, получив ресурс из XAML:

DataGridTextColumn s1 = new DataGridTextColumn() { Header = "Start" };
DataGridTextColumn s2 = new DataGridTextColumn() { Header = "Start" };
DataGridTextColumn e1 = new DataGridTextColumn() { Header = "End" };
DataGridTextColumn e2 = new DataGridTextColumn() { Header = "End" };

DataGridTemplateColumn column = new DataGridTemplateColumn();
column.MinWidth = 0;
column.Width = 2;

var separatorStyle = (Style)FindResource("DataGridColumnSeparatorStyle");
column.CellStyle = separatorStyle;

dataGrid.Columns.Add(s1);
dataGrid.Columns.Add(e1);
dataGrid.Columns.Add(column);
dataGrid.Columns.Add(s2);
dataGrid.Columns.Add(e2);
3 голосов
/ 27 июля 2011

Я думаю, у вас есть два варианта. Простейшим вариантом, вероятно, будет использование Style и установка вашего DataGrid.CellStyle в определенный стиль.

    <Style x:Key="DataGridBorder" TargetType="DataGridCell">
        <Setter Property="BorderBrush" Value="LightGray" />
        <Setter Property="BorderThickness" Value="1,1,1,1" />          
    </Style>
    ...
    <DataGrid CellStyle="{StaticResource DataGridBorder}">
    ...

Другой вариант - использовать CellTemplate в сочетании с DataGridTemplateColumn.

    <DataGridTemplateColumn>
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <Border BorderBrush="LightGray" BorderThickness="1,1,1,1" Margin="-6,-6,-6,-6">
                    <Grid Margin="6,6,6,6">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />                                                    
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding Whatever}" Grid.Column="0" TextTrimming="CharacterEllipsis" VerticalAlignment="Center" />
                    </Grid>                                            
                </Border>
            </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>   

Я не проверял ни одного из них, и вам, возможно, придется немного поиграть с полями.

2 голосов
/ 22 июня 2017

Попробуй это.При перемещении по ячейкам с помощью клавиши табуляции на клавиатуре не выделяется столбец разделителя:

<DataGridTemplateColumn MinWidth="2" MaxWidth="2" IsReadOnly="True" CanUserResize="False">
    <DataGridTemplateColumn.HeaderStyle>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="Background" Value="Gray" />
            <Setter Property="BorderBrush" Value="Gray" />
            <Setter Property="BorderThickness" Value="2" />
        </Style>
    </DataGridTemplateColumn.HeaderStyle>
    <DataGridTemplateColumn.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">                       
            <Setter Property="BorderBrush" Value="Gray" />
            <Setter Property="BorderThickness" Value="2" />                          
            <Setter Property="Focusable" Value="False" />
        </Style>
    </DataGridTemplateColumn.CellStyle>
</DataGridTemplateColumn>

Источник

...