从样式触发器在元素上指定的WPF覆盖属性

时间:2016-12-08 10:54:28

标签: wpf

我有两个具有不同颜色的TextBlock Run元素(一个在元素上显式设置)。我希望它们在值Foo为零时使用相同的样式将颜色更改为红色。这有可能吗?我宁愿不复制Style。这就是我想要的工作:

<Style x:Key="ForegroundStyleTrigger" TargetType="Run">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Foo}" Value="0">
            <Setter Property="Foreground" Value="{StaticResource RedBrush}"></Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>


<TextBlock>
    <Run Text="{Binding Foo, Mode=OneWay}"
         Style="{StaticResource ForegroundStyleTrigger}"/>
    <Run Text="{Binding Bar, Mode=OneWay}"
         Foreground="Blue"
         Style="{StaticResource ForegroundStyleTrigger}"/>
</TextBlock>

但是,由于本地定义的颜色(在元素上定义的颜色)优先于样式触发器,因此没有任何反应,文本运行时文本保持蓝色。

问题:我可以从样式资源覆盖TextBlocks运行颜色吗? 如果没有,如何在不重复样式资源的情况下实现预期结果?

2 个答案:

答案 0 :(得分:2)

  

我可以从样式资源覆盖TextBlocks运行颜色吗?

不,您不能使用样式设置器覆盖本地值。

  

如果没有,如何在不重复样式资源的情况下实现预期结果?

如果你希望默认情况下第二个Run元素的Foreground为蓝色,只有当Foo source属性返回“0”时才为Red,你可以创建另一个样式并将其基于现有样式:

-(void)tableView:(UITableView *)_tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {

            Sqlite *sqlite = [[Sqlite alloc]init];
            [sqlite delete_profile:indexPath.row];

            [resultArray removeObjectAtIndex:indexPath.row];

            [_tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];

     }

}

但是,如果您希望应用样式设置器,则无法将Foreground属性设置为本地值。

答案 1 :(得分:1)

您可以使用Style继承来实现您的要求。诀窍是所有属性必须在Style中,因为本地显式设置值覆盖隐式设置Style值:

<Style x:Key="ForegroundStyleTrigger" TargetType="Run">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Foo}" Value="0">
            <Setter Property="Foreground" Value="{StaticResource RedBrush}"></Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

<Style x:Key="BlueForegroundStyleTrigger" BasedOn="{StaticResource ForegroundStyleTrigger}" TargetType="Run">
    <Setter Property="Foreground" Value="Blue"/>
</Style>


<TextBlock>
    <Run Text="{Binding Foo, Mode=OneWay}"
         Style="{StaticResource ForegroundStyleTrigger}"/>
    <Run Text="{Binding Bar, Mode=OneWay}"
         Style="{StaticResource BlueForegroundStyleTrigger}"/>
</TextBlock>