Estoy tratando de mostrar el borde DataGridRow encima del borde DataGrid. ¿Es eso posible con un estilo o tengo que usar un adorno personalizado?

enter image description here

Quiero lograr algo así:

enter image description here

Intenté usar Panel.ZIndex y ClipToBounds="False" pero no parece funcionar en este caso.

<Style x:Key="MyDataGridRowStyle" TargetType="{x:Type DataGridRow}">
    <Setter Property="SnapsToDevicePixels" Value="true" />
    <Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
    <Setter Property="ValidationErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <TextBlock
                    Margin="2,0,0,0"
                    VerticalAlignment="Center"
                    Foreground="Red"
                    Text="!" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridRow}">
                <Border
                    x:Name="DGR_Border"
                    Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    ClipToBounds="False"
                    SnapsToDevicePixels="True">
                    <SelectiveScrollingGrid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>

                        <Grid.RowDefinitions>
                            <RowDefinition Height="*" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>

                        <DataGridCellsPresenter
                            Grid.Column="1"
                            ItemsPanel="{TemplateBinding ItemsPanel}"
                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />

                        <DataGridDetailsPresenter
                            Grid.Row="1"
                            Grid.Column="1"
                            SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=AreRowDetailsFrozen, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}}"
                            Visibility="{TemplateBinding DetailsVisibility}" />

                        <DataGridRowHeader
                            Grid.RowSpan="2"
                            SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical"
                            Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=HeadersVisibility, Converter={x:Static DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static DataGridHeadersVisibility.Row}}" />
                    </SelectiveScrollingGrid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsNewItem" Value="True">
            <Setter Property="Margin" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=NewItemMargin}" />
        </Trigger>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="BorderThickness" Value="1" />
            <Setter Property="BorderBrush" Value="Red" />
            <Setter Property="Margin" Value="-1,-1,-1,-1" />
            <Setter Property="Panel.ZIndex" Value="123" />
        </Trigger>
    </Style.Triggers>
</Style>
wpf
0
Konrad 1 sep. 2020 a las 17:30

1 respuesta

La mejor respuesta

Debido a la rigidez de WPF, no es posible usar Panel.ZIndex de esa manera, ya que solo se puede usar en el mismo nivel. Pocas soluciones a este problema:

  • Adorno personalizado que dibuja un rectángulo de selección para las filas seleccionadas (debe usar la capa de adorno arriba / en el mismo nivel del borde de DataGrid) se puede usar una plantilla personalizada para agregar AdornerDecorator justo encima del borde.

  • Agregue Canvas y <Rectangle x:Name="PART_SelectionRectangle" /> a la plantilla DataGrid, subclase DataGrid y cambie la posición del Rectangle en Canvas según la selección actual en su DataGrid subclasificado.

No estoy seguro de si hay alguna forma de hacer esto solo con estilo sin subclasificar DataGrid / agregar controladores de eventos, tal vez con un convertidor personalizado que calcula la posición y el tamaño del rectángulo de selección y las propiedades de enlace Rectangle usando ese convertidor.

0
Konrad 4 sep. 2020 a las 10:51