如何在wpf datagrid中继承自定义Textblock样式?

时间:2015-03-18 16:58:42

标签: wpf xaml wpfdatagrid wpf-style

我在WPF Datagrid的DataGridTemplateColumn中有TextBlock。当我检查“IsEnable”为false时,继承DatagridTemplateColumn中的Textblock样式。这是我正在使用的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”并继承Style?的任何想法。

2 个答案:

答案 0 :(得分:0)

我假设您正在尝试根据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定义在哪里,您正在这样做 -

<TextBlock .... Foreground="SomeColor" />

并且您需要直接在TextBlock上删除Foreground设置,以便可以通过样式设置Foreground颜色。

答案 1 :(得分:0)

除非TargetType派生自Control,否则WPF不会在模板中应用隐式样式。由于TextBlock不是从Control派生的,因此不会应用其样式。因此,您必须手动将样式应用于每个非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>