如何在 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>