web-dev-qa-db-ja.com

スタイルのTargetTypeプロパティを基本クラスに設定する

私はWPFを少し突っ込んでいて、ウィンドウ上のすべての要素が同じマージンを共有することを望んでいました。マージンを持つことができるすべてのコントロールがFrameworkElementから派生していることがわかったので、以下を試しました。

<Window.Resources>
<Style TargetType="{x:Type FrameworkElement}">
    <Setter Property="Margin" Value="10" />
</Style>
</Window.Resources>

そして、これは機能しません。これはすべてのボタンに適用できますが、ボタンから派生するすべての要素に適用できるわけではありません。私は何かが足りないのですか、それともこれは単に不可能ですか?

WPFにCSSを使用するのは私だけだと思いますか?

44
Tigraine

残念ながら、基本のFrameworkElementタイプにスタイルを適用することはできません。 WPFではスタイルを記述できますが、そのスタイルから派生するコントロールには適用されません。これは、FrameworkElementのサブタイプにも適用されるようです。 ButtonBase、Button/ToggleButton/RepeatButtonのスーパータイプ。

継承は引き続き使用できますが、明示的なBasedOn構文を使用して、適用するコントロールタイプに適用する必要があります。

<Window.Resources>
    <Style TargetType="{x:Type FrameworkElement}">
        <Setter Property="Margin" Value="10" />
    </Style>

    <Style TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type FrameworkElement}}" />
    <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type FrameworkElement}}" />
    <Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type FrameworkElement}}" />

</Window.Resources>
61

問題は、スタイルを検索するときに、WPFが現在のクラスの派生元であるすべてのクラスを検索しないことです。ただし、スタイルにキーを指定して、共通のプロパティを設定したいすべての要素に適用することができます。スタイリングしている要素に適用できないスタイルでプロパティが指定されている場合、そのプロパティは無視されます。

7
Aran Mulholland