2017-01-30 6 views
0

私は、同じTargetTypeのグローバルリソーススタイルである "BasedOn"というコードビハインドでスタイルを作成しています。新しいスタイルには、元のものと同じプロパティーと、独自のSetterが1つ追加されています。セッターは私の新しいスタイルにコピーされていないので、元のセッターをすべてループして新しいセッターとして私のスタイルに追加するように強制しているようです。この動作を達成するためのより良い方法はありますか?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

ループにセッターを追加しない場合は、UIに適用されるかどうかは関係ありませんか?継承は、Cloneを作成するのではなく、BasedOnスタイルにリンクすることで継承が機能すると推測できます。私はそれを研究するだろう。 –

+0

ああ...私はとても愚かな気がする。はい、UIには適用されますが、デバッグ時には明白ではありません。これはコーディングの冒険に役立ちます。ありがとうございました! – Danielle

答えて

2

Style継承はあなたが推測した通りに機能しません。 BasedOnプロパティをStyleに設定すると、親スタイルの複製にはなりません。代わりに親スタイルが適用され(必要に応じて再帰的に)、子スタイルが適用されます。

あなたのセッターループをコメントアウトし、デバッガであなたのdefaultStyleを見れば、あなたは明示的に追加のみセッターが表示されますが、defaultStyle.BasedOnNumericFieldStyleに展開されます - そしてそこにあなたが不足しているセッターが表示されます。それらは適用されます。

MSDN says「新しいスタイルは、新しいスタイルで明示的に再定義されていない元のスタイルの値を継承しますが、実際に実際に何が起こっているかを説明するためのやり方です。

関連する問題