使用setter方法将属性值重置为默认值是否可行?

7

想知道这是否可能,例如,如果我从一个文本框中移除边框,并且当鼠标悬停在上面时,我希望它恢复默认的边框。

    <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”元数据的默认值吗? - Kent Boogaart
我猜是这样,在描述性术语中:如果我从未设置属性,那么使用的就是任何东西。 - H.B.
在什么情况下你不能这样做?我知道在这种情况下,我可以反转触发器,只有当鼠标不在文本框上时才删除边框。 - Chen Kinnrot
在任何情况下,如果属性显然不是布尔值,则布尔类型是处理最简单的数据类型。 - H.B.
1个回答

5
它并不是这样工作的。DependencyProperty 系统通过考虑众多不同的值来源来工作。正如您可以在这里看到的那样,样式设置器和样式触发器被视为独立的来源。(它们分别在“Dependency Property Setting Precedence List”部分中标有8和6号。) 无论哪个活动值来源具有最高优先级就会获胜。
某种属性来源不能删除由不同来源提供的值。触发器之所以能够改变从 setter 设置的值,是因为触发器具有更高的优先级。没有消除低优先级源提供的值的能力。
实现您在此处表达的特定目标的方法将是反转触发器的意义 - 不要定义样式设置器,并仅在 IsMouseOver 为 false 时使触发器处于活动状态。当然,在您可能想要这样做的所有可能情况下,这并不能帮助您。但由于没有通用解决方案,我认为您需要以其自己的方式解决每个特定的问题。

了解这些优先级很好,谢谢你的回答。 - H.B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接