2017-01-30 2 views
0

Я создаю стиль в коде, который является «BasedOn» глобальным стилем ресурса того же TargetType. Новый стиль имеет все те же свойства, что и оригинал, плюс один дополнительный сеттер, который уникален для него. Кажется, что Setters не копируются в мой новый стиль, заставляя меня перебирать все исходные Setters и добавлять их в качестве новых Setters в моем стиле. Есть ли лучший способ добиться такого поведения?WPF Style BasedOn потеряет сеттеры?

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

Если вы не добавляете сеттеры в цикл, они применяются в пользовательском интерфейсе или нет? Я могу догадаться, что наследование работает, связываясь с стилем BasedOn, а не создавая клон этого. Я бы это исследовал. –

+0

А ... Я чувствую себя очень глупо. Да, это применимо в пользовательском интерфейсе, хотя это не очевидно при отладке. Это должно помочь в моих приключениях к кодированию. Спасибо! – Danielle

ответ

2

Style Наследование не работает так, как вы предполагали. Когда вы устанавливаете свойство BasedOnStyle, оно не становится клоном родительского стиля. Вместо этого применяется родительский стиль (рекурсивно, если это необходимо), а затем применяется дочерний стиль.

Если вы прокомментируете свой цикл сеттера и посмотреть на вашу defaultStyle в отладчике, вы увидите только сеттер вы добавили в явном виде, но defaultStyle.BasedOn будет расширяться NumericFieldStyle - и там вы увидите недостающие сеттер. Они будут применены.

«новый стиль наследует значения оригинального стиля, которые явно не переопределены в новом стиле», но, как вы можете видеть, это несколько блестящий способ описать, что на самом деле происходит на практике.