WPF Style BasedOn失去了Setters?

时间:2017-01-30 19:04:00

标签: c# wpf infragistics

我在代码隐藏中创建了一个样式,即" BasedOn"相同TargetType的全局资源样式。新款式具有与原版相同的所有属性,另外还有一个独特的Setter。看起来Setters并没有复制到我的新风格,迫使我循环遍历所有原始的Setter并将它们添加为我的风格的新Setters。有没有更好的方法来实现这种行为?

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);

1 个答案:

答案 0 :(得分:2)

Style继承并不像你猜测的那样工作。当您设置BasedOn的{​​{1}}属性时,它不会成为父样式的克隆。而是应用父样式(如果需要,递归),然后应用子样式。

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

MSDN says"新样式将继承原始样式的值,这些值未在新样式中明确重新定义",但正如您所看到的那样,有点滑稽的方式描述在实践中真正发生的事情。