カスタムコントロール(つまり、System.Windows.Controlから派生したクラス)があり、デフォルトのスタイルを設定したいと思います。themes / generic.xamlを作成し、そこでスタイルを定義することで、それが可能であることを私は知っています。私は以前にそれをしました、そしてそれは働きます。
ただし、スタイルはかなり些細なものであるため(すばやくモックアップできるようにするための単なるダミーの長方形です)、デフォルトのスタイルをコードのみで定義して、クラス定義に近づけ、ファイルが乱雑にならないようにします。 generic.xaml。これは私がこれまでに行ったことです:
static Trailer()
{
// just there to be able to test it alternatively with generic.xaml
FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(typeof(Trailer), new FrameworkPropertyMetadata(typeof(Trailer)));
// define the template with dummy geometry
ControlTemplate DefaultTemplate = new ControlTemplate(typeof(Trailer));
FrameworkElementFactory rectFact = new FrameworkElementFactory(typeof(Rectangle));
rectFact.SetValue(Shape.FillProperty, new DynamicResourceExtension(SystemColors.ControlLightBrushKey));
DefaultTemplate.VisualTree = rectFact;
// define the style
Style DefaultStyle = new Style {TargetType = typeof (Trailer)};
Setter setter = new Setter();
setter.Property = Control.TemplateProperty;
setter.Value = DefaultTemplate;
DefaultStyle.Setters.Add(setter);
// register the style in application resources
Application.Current.Resources.Add(typeof(Trailer), DefaultStyle);
}
これは非常に単純なテストアプリケーションで機能しますが、コントロールが空のままである他のスタイル/テンプレート(デフォルトのコントロールスタイル)を使用したより複雑な設定では失敗します。干渉の原因を特定することはできませんが、上記のコードでコントロールのデフォルトスタイルを実際に設定していないことの証拠と見なします。
generic.xamlと同じ動作を実現するには、アプリケーションリソースにない場合、どこでスタイルを設定する必要がありますか?
この問題について深く考え、依存関係のプロパティに関する私の(初心者の)知識を要約した後、私は簡単な解決策を見つけました。これは私が機能することが証明されています。交換する必要がありました
Application.Current.Resources.Add(typeof(Trailer), defaultStyle);
沿って
FrameworkElement.StyleProperty.OverrideMetadata(typeof(Trailer),
new FrameworkPropertyMetadata(defaultStyle));
これは、DependencyPropertyのデフォルト値を変更する公式の方法に他なりません。
私はすでにこの方向を考えていましたが、私の間違いは「DefaultStyleProperty」(DefaultStylePropertyKeyに対応する...)を見つけることを期待していたことでしたが、デフォルト値を変更するより簡単で自然な可能性については考えていませんでした私のクラスのStylePropertyの。
マイクロソフトのデザインが非常に論理的で注意深く作成されていることが再び判明したことを嬉しく思います(アーメン...)。
補遺: WPFインスペクターでビジュアルツリーを確認しました。generic.xamlを指定するか、上記のコードのみの方法を使用するかに関係なく、これらは同一です。
一貫性の追加機能として、私は追加しました
FrameworkElement.OverridesDefaultStyleProperty.OverrideMetadata(typeof(Trailer),
new FrameworkPropertyMetadata(true));
これにより、デフォルトのスタイルがgeneric.xamlからロードされないようにします。とにかく自分でスタイルを設定しているので、実際には違いはありません。ただし、これが望ましくない副作用を引き起こす可能性があるかどうかはわかりませんが、注意してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加