【问题标题】:Style Trigger to Apply another Style样式触发器以应用另一种样式
【发布时间】:2011-09-22 18:45:05
【问题描述】:

我确信以前有人问过这个问题,但我没有很容易弄清楚如何表达这个查询。

我有这种风格;

<SolidColorBrush x:Key="SemiTransparentRedBrushKey">#F0FF0000</SolidColorBrush>
<Style x:Key="TextBoxEmptyError" TargetType="{x:Type TextBox}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text.Length}" Value="0">
            <Setter Property="BorderBrush" Value="{StaticResource ResourceKey=SemiTransparentRedBrushKey}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

当文本框为空时,我可以将其应用于文本框以具有红色边框。太好了,我可以将Style="{StaticResource TextBoxEmptyError}" 添加到控制标签中。但是,如果我想通过触发器应用这种样式,以便控件仅在某些条件下使用它(例如绑定为真),该怎么办?比如:

<TextBox.Style>
<Style TargetType="TextBox">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=ApprovedRequired}" Value="True">
            <Setter Property="Style" Value="{StaticResource TextBoxEmptyError}"></Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

尽管{"Style object is not allowed to affect the Style property of the object to which it applies."},此代码引发异常

这样的事情可以做吗?

编辑:如果样式触发器无法做到这一点,因为它会覆盖自身,是否有其他方法可以有条件地应用资源样式?

编辑:如果此操作有更合适的术语,我可以更改问题标题。

【问题讨论】:

  • 你考虑过使用Validation.ErrorTemplate吗?见:wpftutorial.net/DataValidation.html
  • 是的,但我确定这对于我正在使用的某些表单来说太过分了。这个问题的答案也将更适用于一般的样式使用,而不仅仅是我的红色错误边框。

标签: wpf triggers styles


【解决方案1】:

样式不能从样式内的 Setter 中设置,因为这样基本上第一个样式根本不存在。

由于您正在寻找验证样式,我建议您查看Validation.ErrorTemplate,尽管如果这不起作用,您可以更改触发器,以便修改特定属性,例如 BorderBrush 而不是 Style 属性

【讨论】:

  • 我知道我给出了一个特定的实例,但我想在问题中有一些代码。在某些情况下,将使用与错误无关的样式(如粗体)。我可以在每个控件中重新创建它们,但这似乎违反了 DRY 原则。如果以后想更新样式怎么办?每个控件都将其触发器绑定到不同的属性,因此每个控件样式设置器都需要单独更新,即使它们都是相同的。
  • +1 表示“无法从样式中的 Setter 设置样式”——我什至没有注意到我这样做是错误的。
【解决方案2】:

我会考虑使用带有 TemplateTrigger 的模板,您可以根据条件将样式更改为您喜欢的样式

【讨论】:

    猜你喜欢
    • 2011-01-27
    • 2016-06-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2013-08-06
    相关资源
    最近更新 更多