【问题标题】:Is it possible to use a setter to return a property to its default value?是否可以使用 setter 将属性返回为其默认值?
【发布时间】:2011-06-10 02:33:49
【问题描述】:

想知道这是否可能,例如如果我从 TextBox 中删除边框,并且我想在鼠标悬停时恢复其默认边框。

    <Style TargetType="TextBox">
        <Setter Property="BorderBrush" Value="{x:Null}"/>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="BorderBrush" Value="?????"/>
            </Trigger>
        </Style.Triggers>
    </Style>

我以为我可以使用它,但最后隐藏边框似乎是个坏主意,但问题仍然存在。 (我知道在这种情况下,如果鼠标不在文本框上方,我可以反转触发器以仅删除边框)

【问题讨论】:

  • 定义默认值。您是指分配给底层DependencyProperty 元数据的默认值吗?
  • 我猜是这样,用描述性术语来说:如果我从不设置属性,则使用什么。
  • “我知道在这种情况下我可以反转触发器以仅在鼠标不在文本框上方时才删除边框” - 在什么情况下您不能?
  • 在属性显然不是布尔值的任何情况下,布尔值是迄今为止最简单的处理类型。

标签: wpf wpf-controls styles setter


【解决方案1】:

它实际上不是那样工作的。 DependencyProperty 系统通过考虑许多不同的值源来工作。正如您所看到的here,样式设置器和样式触发器被认为是独立的来源。 (它们在“依赖属性设置优先级列表”部分中分别编号为 8 和 6。)具有最高优先级的活动值源获胜。

一种属性来源不能删除不同来源提供的值。触发器能够更改设置器设置的值的唯一原因是触发器具有更高的优先级。没有权力消除低优先级来源提供的价值。

实现您在此处表达的特定目标的方法是反转触发器的含义 - 不要定义样式设置器,并且仅当 IsMouseOver 为 false 时才使触发器处于活动状态。当然,在您可能想要这样做的所有可能情况下,这对您没有帮助。但由于没有通用的解决方案,我认为您需要以自己的方式解决每个具体问题。

【讨论】:

  • 很高兴了解这些优先级,谢谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 2021-11-16
  • 1970-01-01
  • 2012-01-30
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多