WPF DataGrid如何实现选中行透明底色并仅显示行轮廓
WPF DataGrid 选中行仅添加轮廓边框实现问题
需求描述
- 选中DataGrid行时,不修改原有单元格的前景色、背景色,仅为选中行添加轮廓边框效果。
- 最初检索相关实现方案时,仅找到WinForms平台的对应实现,未找到适配WPF场景的方案。
现有实现配置
按照思路将选中行相关的配置项添加到现有Window.Resources资源中,当前XAML资源部分完整代码如下:
<Window.Resources> <local:NullImageConverter x:Key="nullImageConverter"/> <Style x:Key="DataGridColumnSeparatorStyle" TargetType="DataGridCell"> <Setter Property="Template"> <Setter.Value> <ControlTemplate> <Rectangle VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Fill="#1e90ff"/> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style x:Key="DataGridColumnAlarmStyle" TargetType="DataGridCell"> <Setter Property="Template"> <Setter.Value> <ControlTemplate> <Rectangle VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Fill="#000000"/> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style x:Key="RowStyleWithAlternation" TargetType="DataGridRow"> <Setter Property="Background" Value="#141414"/> <Setter Property="Foreground" Value="White"/> <Setter Property="FontWeight" Value="Normal"/> <Style.Triggers> <Trigger Property="AlternationIndex" Value="1"> <Setter Property="Background" Value="#1e1e1e"/> </Trigger> <Trigger Property="IsSelected" Value="True"> <Setter Property="BorderBrush" Value="#1e90ff" /> <Setter Property="BorderThickness" Value="1" /> </Trigger> </Style.Triggers> </Style> <Style TargetType="DataGridCell"> <Setter Property="TextBlock.TextAlignment" Value="Center" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type DataGridCell}"> <Grid Background="{TemplateBinding Background}"> <ContentPresenter VerticalAlignment="Stretch"/> </Grid> </ControlTemplate> </Setter.Value> </Setter> <Setter Property="VerticalAlignment" Value="Stretch"/> <Setter Property="Padding" Value="0"/> <Setter Property="Margin" Value="0"/> <Setter Property="BorderThickness" Value="0"/> <Style.Triggers> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding Column.Header, RelativeSource={RelativeSource Self}}" Value=" "/> </MultiDataTrigger.Conditions> <MultiDataTrigger.Setters> <Setter Property="DataGridCell.Background" Value="{Binding Path=Balance.ProfitPercentageColor}" /> </MultiDataTrigger.Setters> </MultiDataTrigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding Column.Header, RelativeSource={RelativeSource Self}}" Value="Symbol"/> </MultiDataTrigger.Conditions> <MultiDataTrigger.Setters> <Setter Property="DataGridCell.Background" Value="{Binding Path=Balance.ProfitPercentageColor}" /> </MultiDataTrigger.Setters> </MultiDataTrigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding Column.DisplayIndex, RelativeSource={RelativeSource Self}}" Value="11"/> </MultiDataTrigger.Conditions> <MultiDataTrigger.Setters> <Setter Property="DataGridCell.Background" Value="{Binding Path=Balance.ProfitPercentageColor}" /> <Setter Property="DataGridCell.Foreground" Value="{Binding Path=Balance.ProfitColor}" /> </MultiDataTrigger.Setters> </MultiDataTrigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding Column.DisplayIndex, RelativeSource={RelativeSource Self}}" Value="12"/> </MultiDataTrigger.Conditions> <MultiDataTrigger.Setters> <Setter Property="DataGridCell.Background" Value="{Binding Path=Balance.ProfitPercentageColor}" /> <Setter Property="DataGridCell.Foreground" Value="{Binding Path=Balance.ProfitColor}" /> </MultiDataTrigger.Setters> </MultiDataTrigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding Column.DisplayIndex, RelativeSource={RelativeSource Self}}" Value="13"/> </MultiDataTrigger.Conditions> <MultiDataTrigger.Setters> <Setter Property="DataGridCell.Background" Value="{Binding Path=PriceChangeDailyBackColor}" /> <Setter Property="DataGridCell.Foreground" Value="{Binding Path=PriceChangeDailyForeColor}" /> </MultiDataTrigger.Setters> </MultiDataTrigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding Column.DisplayIndex, RelativeSource={RelativeSource Self}}" Value="14"/> </MultiDataTrigger.Conditions> <MultiDataTrigger.Setters> <Setter Property="DataGridCell.Background" Value="{Binding Path=PriceChangeHourlyBackColor}" /> <Setter Property="DataGridCell.Foreground" Value="{Binding Path=PriceChangeHourlyForeColor}" /> </MultiDataTrigger.Setters> </MultiDataTrigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding Column.Header, RelativeSource={RelativeSource Self}}" Value="Min %"/> </MultiDataTrigger.Conditions> <MultiDataTrigger.Setters> <Setter Property="DataGridCell.Foreground" Value="{Binding Path=PriceChangeMinutelyForeColor}" /> </MultiDataTrigger.Setters> </MultiDataTrigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding Column.Header, RelativeSource={RelativeSource Self}}" Value="Net BTC/m"/> </MultiDataTrigger.Conditions> <MultiDataTrigger.Setters> <Setter Property="DataGridCell.Background" Value="{Binding Path=LastMinuteVolumeColor}" /> </MultiDataTrigger.Setters> </MultiDataTrigger> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="{x:Null}"/> <Setter Property="BorderBrush" Value="{x:Null}"/> </Trigger> </Style.Triggers> </Style> <Style TargetType="DataGridColumnHeader"> <Setter Property="HorizontalContentAlignment" Value="Center" /> </Style> <Style TargetType="{x:Type ProgressBar}"> <Setter Property="Padding" Value="0"/> <Setter Property="Margin" Value="0"/> <Setter Property="VerticalAlignment" Value="Stretch"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ProgressBar"> <Border BorderThickness="1" Background="#006400" CornerRadius="0" Padding="0"> <Grid x:Name="PART_Track"> <Rectangle x:Name="PART_Indicator" HorizontalAlignment="Left" Fill="#640000" /> </Grid> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> <CollectionViewSource Source="{Binding Coins}" IsLiveSortingRequested="True" x:Key="MyKey" /> </Window.Resources>
当前运行效果与待解决问题
- 已实现的正常效果:可完整保留原有的行交替配色规则。
- 待解决问题:设置了分隔样式的列在选中状态下仍会按原有规则渲染样式,暂未找到适配该场景的优化方案。
内容的提问来源于stack exchange,提问作者Joan Venge
相关产品推荐
相关产品推荐

