WPF DataGrid DataGridRow 选择边框和间距

WPF DataGrid DataGridRow Selection Border and Spacing

我正在使用 WPF DataGrid 显示数据,当用户选择一行时,我希望突出显示整行的背景(使用渐变)并且还有边框。我一直在使用以下代码,大部分情况下都有效:

    <Style TargetType="DataGridRow">
        <Setter Property="BorderBrush" Value="Transparent" />
        <Setter Property="BorderThickness" Value="0" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsChecked}" Value="True">
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="BorderBrush" Value="{StaticResource BorderColor}" />
            <Setter Property="Background" Value="{StaticResource BackgroundColor}" />
        </DataTrigger>
    </Style.Triggers>
    </Style>

我遇到的这个问题与边框有关。如果 BorderThickness 初始设置为 0,则当 DataTrigger 被触发时,整个 Row "shifts over" 为边框 space。如果我最初将 BorderThickness 设置为 1,则突出显示的 Row 会正确显示,但当它处于默认状态时,Row 周围有一个空边框,导致 Row 网格线不接触边缘。

关于如何解决这个问题的任何想法?

我发现使用 ListBox 而不是 DataGrid 可以更轻松地调整视觉效果,所以这可能是一种方法。

试试这个作为起点:

<ListBox>
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsChecked}" Value="True">
                    <Setter Property="BorderBrush" Value="{StaticResource BorderColor}" />
                    <Setter Property="Background" Value="{StaticResource BackgroundColor}" />
                </DataTrigger>
            </Style.Triggers>
            <Setter Property="Background" Value="Transparent" />
            <Setter Property="BorderBrush" Value="Transparent" />
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type local:MyClass}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="30" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <CheckBox IsChecked="{Binding IsChecked}" />
                <TextBlock Text="{Binding MyTextProperty}" Grid.Column="1" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

这应该设置正确的边框和背景,而不会移动选定行的元素或显示未选定行的周围间隙。 只需将 local:MyClass 替换为您的 class 并为您的场景自定义网格内容。

请参阅 this answer 如何处理 MouseOver/Selected 样式,我尝试将模板 属性 setter 复制到上面的示例中并调整 Panel.Background和 Border.BorderBrush setters 这似乎运作良好。