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 这似乎运作良好。
我正在使用 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 这似乎运作良好。