我有两个具有不同颜色的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运行颜色吗? 如果没有,如何在不重复样式资源的情况下实现预期结果?
答案 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>