我在代码隐藏中创建了一个样式,即"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);发布于 2017-01-31 03:25:25
Style继承并不像您猜测的那样工作。当您设置Style的BasedOn属性时,它不会成为父样式的克隆。取而代之的是,应用父样式(如果需要,递归),然后应用子样式。
如果注释掉setter循环并在调试器中查看defaultStyle,您将只看到显式添加的setter,但defaultStyle.BasedOn将展开为NumericFieldStyle --在那里您将看到缺少的setter。它们将会被应用。
MSDN says“新样式将继承未在新样式中显式重新定义的原始样式的值”,但正如您所看到的,这是描述实际发生的事情的一种有点油滑的方式。
https://stackoverflow.com/questions/41943542
复制相似问题