是否可以使用setter将属性返回到其默认值?

时间:2011-01-16 19:41:22

标签: wpf wpf-controls styles setter

想知道这是否可行,例如如果我从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>
我认为我可以使用它,但最后隐藏边界似乎是一个坏主意,但问题仍然存在。 (我知道在这种情况下,如果鼠标不在TextBox上,我可以将Trigger反转为仅移除边框)

1 个答案:

答案 0 :(得分:5)

它并没有真正起作用。 DependencyProperty系统通过考虑众多不同的价值来源来工作。正如您可以看到here,样式设置器和样式触发器被视为单独的源。 (它们在“依赖属性设置优先级列表”部分中分别编号为8和6。)无论哪个活动值源具有最高优先级,都会获胜。

一种财产来源无法移除其他来源提供的价值。触发器能够将值从setter设置为更改的唯一原因是触发器具有更高的优先级。没有权力消除低优先级来源提供的价值。

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