如何避免WPF工具提示覆盖DataGridCell默认样式
解决方案:避免DataGridCell自定义样式覆盖默认旋转布局
问题根源是:当你直接定义Style TargetType="DataGridCell"时,该样式不会自动继承全局默认的DataGridCell样式,导致原有旋转布局、模板等关键设置被覆盖,最终单元格显示异常。
以下是两种可行的解决方法:
方法1:基于默认样式继承扩展
在自定义CellStyle时,通过BasedOn属性绑定全局默认样式,保留原有旋转布局的同时叠加你的校验逻辑:
<DataGridTextColumn.CellStyle> <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}"> <Setter Property="ToolTip" > <Setter.Value> <ToolTip Visibility="{Binding Path=TaxTT, Converter={StaticResource StringToVisibleTT}}" > <TextBlock Text="{Binding TaxTT}" /> </ToolTip> </Setter.Value> </Setter> <Setter Property="Foreground" Value="{Binding Path=TaxTT, Converter={StaticResource FormattingConverterTT}}"/> </Style> </DataGridTextColumn.CellStyle>
关键说明
BasedOn="{StaticResource {x:Type DataGridCell}}"会自动应用全局定义的隐式DataGridCell样式。如果你的全局样式设置了x:Key(比如x:Key="DefaultDataGridCellStyle"),则需要将BasedOn的值改为对应Key:BasedOn="{StaticResource DefaultDataGridCellStyle}"。
方法2:将校验逻辑整合到全局样式(推荐)
如果多个列都需要类似的校验标记,可以把tooltip和前景色逻辑直接合并到全局DataGridCell样式中,避免重复定义:
修改全局样式:
<Style TargetType="{x:Type DataGridCell}"> <Setter Property="Focusable" Value="False" /> <Setter Property="IsTabStop" Value="False" /> <Setter Property="LayoutTransform"> <Setter.Value> <TransformGroup> <RotateTransform Angle="-90"/> <ScaleTransform ScaleX="1" ScaleY="-1" /> </TransformGroup> </Setter.Value> </Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type DataGridCell}"> <Grid Background="{DynamicResource AppGlobalBackground}"> <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Left"/> <TextBlock> <ContentPresenter Margin="0,2,10,2"/> </TextBlock> </Grid> </ControlTemplate> </Setter.Value> </Setter> <!-- 新增校验相关设置 --> <Setter Property="ToolTip" > <Setter.Value> <ToolTip Visibility="{Binding Path=ValidationTooltip, Converter={StaticResource StringToVisibleTT}}" > <TextBlock Text="{Binding ValidationTooltip}" /> </ToolTip> </Setter.Value> </Setter> <Setter Property="Foreground" Value="{Binding Path=ValidationTooltip, Converter={StaticResource FormattingConverterTT}}"/> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="{DynamicResource AppGlobalBackground}" /> <Setter Property="Foreground" Value="{DynamicResource AppGlobalForeground}" /> <Setter Property="BorderBrush" Value="{DynamicResource AppGlobalBackground}" /> </Trigger> <Trigger Property="IsFocused" Value="True"> <Setter Property="IsSelected" Value="True" /> </Trigger> </Style.Triggers> </Style>
之后在ViewModel中给每个需要校验的字段对应一个ValidationTooltip属性(比如Tax字段对应TaxTT,其他字段同理),所有列会自动应用校验样式,同时保留原有的旋转布局。
内容的提问来源于stack exchange,提问作者Dr Hoo
相关产品推荐
相关产品推荐

