1. ホーム
  2. .net

[解決済み] WPFで複数のスタイルを適用する方法

2022-04-25 09:44:44

質問

WPFでは、どのように複数のスタイルを FrameworkElement ? 例えば、すでにスタイルが設定されているコントロールがあるとします。 また、別のスタイルがあり、最初のスタイルを削除することなく、それに追加したいと思います。 これらのスタイルは異なるTargetTypesを持っているので、一方をもう一方に拡張することはできません。

どのように解決するのですか?

簡単な答えは、あなたがやろうとしていることは(少なくともこのバージョンのWPFでは)できない、ということだと思います。

つまり、特定の要素には1つのStyleしか適用できないのです。

しかし、上記の他の方がおっしゃっているように、もしかしたら BasedOn を使用するとよいでしょう。次の緩いxamlの部分をチェックしてみてください。この中で、2つのスタイルを適用したい要素の基底クラスに存在するプロパティを設定する基底スタイルがあることがわかります。そして、ベース・スタイルに基づく2つ目のスタイルでは、別のプロパティを設定しています。

つまり、ここで考えられるのは......複数のスタイルを設定したい要素の継承階層に応じて、設定したいプロパティを何らかの方法で分離すれば......回避できる可能性があるということです。

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Page.Resources>
        <Style x:Key="baseStyle" TargetType="FrameworkElement">
            <Setter Property="HorizontalAlignment" Value="Left"/>
        </Style>
        <Style TargetType="Button" BasedOn="{StaticResource baseStyle}">
            <Setter Property="Content" Value="Hello World"/>
        </Style>
    </Page.Resources>
    <Grid>
        <Button Width="200" Height="50"/>
    </Grid>
</Page>



お役に立てれば幸いです。

特に注意すべきは、その一点です。を変更した場合 TargetType を、2 番目のスタイル (上記の xaml の最初のセット) で ButtonBase の場合、2つのStyleは適用されません。しかし、その制約を回避するために、以下のxamlをチェックしてみてください。基本的には、Styleにキーを与え、そのキーで参照する必要があるということです。

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Page.Resources>
        <Style x:Key="baseStyle" TargetType="FrameworkElement">
            <Setter Property="HorizontalAlignment" Value="Left"/>
        </Style>
        <Style x:Key="derivedStyle" TargetType="ButtonBase" BasedOn="{StaticResource baseStyle}">
            <Setter Property="Content" Value="Hello World"/>
        </Style>
    </Page.Resources>
    <Grid>
        <Button Width="200" Height="50" Style="{StaticResource derivedStyle}"/>
    </Grid>
</Page>