如何在 wpf datagrid 中继承自定义 Textblock 样式?
How to inherit custom Textblock style in wpf datagrid?
我在 WPF Datagrid 的 DataGridTemplateColumn 中有 TextBlock。当我选中 "IsEnable" false 以继承 DatagridTemplateColumn 中的文本块样式时。这是我正在使用的 XAML 代码:
<Style TargetType="{x:Type DataGrid}" >
<Setter Property="Template" >
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGrid }">
<ControlTemplate.Resources >
<Style TargetType="{x:Type TextBlock }">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{StaticResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</Style.Triggers>
</Style>
</ControlTemplate.Resources>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这没有用,后来我试了:
<Style TargetType="TextBlock" >
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{StaticResource {x:Static SystemColors.GrayTextBrushKey}}" />
</Trigger>
</Style.Triggers>
</Style>
关于如何检查 Datagrid 中的 Texblock 是否 "IsEnabled" 并继承样式有任何想法吗?
我假设您正在尝试根据 TextBlock 的 IsEnabled 状态切换前景色。
您在哪里设置 IsEnabled = true 前景色?您还没有为要设置样式的实际 TextBlock 提供代码。
试试这个:
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="True">
<Setter Property="Foreground" Value="Red" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="Green" />
</Trigger>
</Style.Triggers>
</Style>
如果这不起作用,则意味着在定义文本块的任何地方,您都在执行此操作 -
<TextBlock .... Foreground="SomeColor" />
并且需要直接在TextBlock上去掉Foreground的设置,这样Foreground的颜色才能由样式设置。
WPF 不会在模板内应用隐式样式,除非 TargetType 派生自 Control。由于 TextBlock 不是从 Control 派生的,因此不应用其样式。因此,您要么必须手动将样式应用于每个非控件,要么在模板中定义隐式样式。
将数据网格资源中的样式定义为
<DataGrid.Resources>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
我在 WPF Datagrid 的 DataGridTemplateColumn 中有 TextBlock。当我选中 "IsEnable" false 以继承 DatagridTemplateColumn 中的文本块样式时。这是我正在使用的 XAML 代码:
<Style TargetType="{x:Type DataGrid}" >
<Setter Property="Template" >
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGrid }">
<ControlTemplate.Resources >
<Style TargetType="{x:Type TextBlock }">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{StaticResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</Style.Triggers>
</Style>
</ControlTemplate.Resources>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这没有用,后来我试了:
<Style TargetType="TextBlock" >
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{StaticResource {x:Static SystemColors.GrayTextBrushKey}}" />
</Trigger>
</Style.Triggers>
</Style>
关于如何检查 Datagrid 中的 Texblock 是否 "IsEnabled" 并继承样式有任何想法吗?
我假设您正在尝试根据 TextBlock 的 IsEnabled 状态切换前景色。
您在哪里设置 IsEnabled = true 前景色?您还没有为要设置样式的实际 TextBlock 提供代码。
试试这个:
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="True">
<Setter Property="Foreground" Value="Red" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="Green" />
</Trigger>
</Style.Triggers>
</Style>
如果这不起作用,则意味着在定义文本块的任何地方,您都在执行此操作 -
<TextBlock .... Foreground="SomeColor" />
并且需要直接在TextBlock上去掉Foreground的设置,这样Foreground的颜色才能由样式设置。
WPF 不会在模板内应用隐式样式,除非 TargetType 派生自 Control。由于 TextBlock 不是从 Control 派生的,因此不应用其样式。因此,您要么必须手动将样式应用于每个非控件,要么在模板中定义隐式样式。 将数据网格资源中的样式定义为
<DataGrid.Resources>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>