【问题标题】:Styles versus property inheritance样式与属性继承
【发布时间】:2012-12-17 22:18:37
【问题描述】:

我正在处理一个 WPF 应用程序,其中为大多数基本控件(文本框等)定义了元素类型的样式。我现在有一个控件,在一个控件中,在一个控件中......基本上我没有办法直接改变文本框属性,所以我在我的控件中设置了属性(字体大小),希望这个属性会传播给所有的孩子的控制。不幸的是,元素类型的样式优先于我的控件属性。

有没有办法覆盖这些元素类型的样式?

【问题讨论】:

    标签: wpf properties styles


    【解决方案1】:

    如果我理解得很好,您将FontSize 设置为TextBoxStyle 中(例如FontSize=15)。您还有一个包含一些 Textbox 子项的控件。

    当您设置Control FontSize=10 时,TextBox 子项的 FontSize 为 15,而您期望它为 10。

    这是你的问题吗?如果是,会发生这种情况:

    FontSize 是一个依赖属性。因此,它的值可以由许多不同的提供者给出,这些提供者在下面列出(从Dependency Property Setting Precedence List msdn 获取的简化列表)从高到低优先级

    1. 属性系统强制。
    2. 活动动画,或具有 Hold 行为的动画。
    3. 本地值。
    4. TemplatedParent 模板属性。
    5. 隐式风格。仅适用于 Style 属性。
    6. 样式触发器。
    7. 模板触发器。
    8. 样式设置器。
    9. 默认(主题)样式。在默认样式中,应用以下优先顺序:
    10. 继承。
    11. 依赖属性元数据的默认值。

    在您的具体情况下,TextBox FontSize 将根据以下来源设置:

    • FontSize=15 来自 Style(优先级 8)
    • FontSize=10 来自 Control FontSize(优先级 10)

    FontSize 的值将获胜,因为它具有更高的优先级。

    总之,您可以根据设置的优先级列表,使用具有更高优先级的提供程序来覆盖 Style 给定的 FontSize。

    希望对你有帮助

    【讨论】:

    • 很高兴你发现它很有用。
    【解决方案2】:

    如何设置元素的特定属性?例如。对于 TextBox 是 FontSize = 10,对于组合框是 11?还是 10,即所有元素的标准尺寸?如果是这样,为什么要在元素样式之间设置相同的值?

    如果元素之间的不同,那么当您设置控件特定的字体大小时,您期望什么?它应该覆盖元素特定的字体大小吗?如果是这样,为什么您首先设置元素特定的字体?您的控件(或应用程序更确切地说)是否应该定义一个字体大小,该字体大小将级联到可视树中的最小元素(如果到处都需要相同的字体?)。在这种情况下,我建议您摆脱元素特定的字体大小。

    【讨论】:

    • 我认为您删除元素特定字体大小是正确的。问题是这可能会产生一些后果。如果“属性级联”优先于元素类型样式会更好
    猜你喜欢
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2020-01-16
    • 1970-01-01
    • 2014-02-03
    相关资源
    最近更新 更多