【问题标题】:WPF Style BasedOn Loses Setters?WPF Style BasedOn 输了?
【发布时间】:2017-01-30 19:04:00
【问题描述】:

我正在代码隐藏中创建一个样式,它是“BasedOn”相同 TargetType 的全局资源样式。新样式具有与原始样式相同的所有属性,另外还有一个独特的 Setter。不过,似乎 Setter 并没有复制到我的新样式中,这迫使我遍历所有原始 Setter,并将它们作为新的 Setter 添加到我的样式中。有没有更好的方法来完成这种行为?

Style defaultStyle = Application.Current.FindResource("NumericFieldStyle") as Style;
Style decimalStyle = new Style(typeof(XamMaskedEditor), defaultStyle);
    // No setters in decimalStyle? There were 6 in defaultStyle
    foreach (SetterBase setter in defaultStyle.Setters)
            decimalStyle.Setters.Add(setter);

【问题讨论】:

  • 如果您不在循环中添加设置器,它们是否应用在 UI 中?我可能猜测继承是通过链接到 BasedOn 样式而不是通过创建它的克隆来工作的。我会研究一下。
  • 啊……我觉得很傻。是的,它确实适用于 UI,尽管在调试时并不明显。这应该有助于我的编码冒险。谢谢!

标签: c# wpf infragistics


【解决方案1】:

Style 继承并不像你猜的那样工作。当您设置StyleBasedOn 属性时,它不会成为父样式的克隆。相反,应用父样式(如果需要,递归),然后应用子样式。

如果您注释掉您的 setter 循环并在调试器中查看您的 defaultStyle,您将只会看到您明确添加的 setter,但 defaultStyle.BasedOn 将扩展为 NumericFieldStyle - 您会看到失踪的二传手。它们将被应用。

MSDN says“新样式将继承新样式中未明确重新定义的原始样式的值”,但正如您所见,这是描述实际发生的事情的一种有点油嘴滑舌的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2011-08-10
    • 2013-11-30
    相关资源
    最近更新 更多