C# WPF风格的BasedOn丢了二传手?
我在代码背后创建了一个样式,它是“BasedOn”,是同一TargetType的全局资源样式。新样式具有与原始样式相同的所有属性,另外还有一个独特的Setter。看起来setter并没有复制到我的新样式中,这迫使我遍历所有原始setter,并将它们作为新setter添加到我的样式中。有没有更好的方法来实现这种行为C# WPF风格的BasedOn丢了二传手?,c#,wpf,infragistics,C#,Wpf,Infragistics,我在代码背后创建了一个样式,它是“BasedOn”,是同一TargetType的全局资源样式。新样式具有与原始样式相同的所有属性,另外还有一个独特的Setter。看起来setter并没有复制到我的新样式中,这迫使我遍历所有原始setter,并将它们作为新setter添加到我的样式中。有没有更好的方法来实现这种行为 Style defaultStyle = Application.Current.FindResource("NumericFieldStyle") as Style; Style d
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);
Style
继承并不像你想象的那样有效。当您将样式的BasedOn
属性设置为时,它不会成为父样式的克隆。相反,应用父样式(如果需要,递归),然后应用子样式
如果注释掉setter循环,并在调试器中查看defaultStyle
,您将只看到显式添加的setter,但是defaultStyle.BasedOn
将扩展到NumericFieldStyle
——在那里您将看到缺少的setter。它们将被应用
“新样式将继承未在新样式中明确重新定义的原始样式的值”,但正如您所见,这是一种描述实际情况的有点油嘴滑舌的方式 风格
继承并不像你想象的那样有效。当您将样式的BasedOn
属性设置为时,它不会成为父样式的克隆。相反,应用父样式(如果需要,递归),然后应用子样式
如果注释掉setter循环,并在调试器中查看defaultStyle
,您将只看到显式添加的setter,但是defaultStyle.BasedOn
将扩展到NumericFieldStyle
——在那里您将看到缺少的setter。它们将被应用
“新样式将继承未在新样式中明确重新定义的原始样式的值”,但正如您所见,这是一种描述实际情况的有点油嘴滑舌的方式 如果不在循环中添加setter,它们是否应用于UI?我可能猜继承是通过链接到BasedOn样式来工作的,而不是通过创建它的克隆来工作的。我会研究的。啊。。。我觉得自己很傻。是的,它确实适用于UI,尽管在调试时并不明显。这将有助于我的编码冒险。非常感谢。如果不在循环中添加setter,它们是否应用于UI?我可能猜继承是通过链接到BasedOn样式来工作的,而不是通过创建它的克隆来工作的。我会研究的。啊。。。我觉得自己很傻。是的,它确实适用于UI,尽管在调试时并不明显。这将有助于我的编码冒险。非常感谢。