web-dev-qa-db-ja.com

リソースディクショナリの別のスタイルに基づいてスタイルを作成するにはどうすればよいですか?

リソースディクショナリのすべてのボタンに適用されるテーマがあります。辞書からスタイルの変更を継承しながら、ボタンにトリガーを追加したいと思います。次のコードを試しましたが、コントロールが見つからないと表示されます。どうすれば修正できますか?

<UserControl.Resources>
  <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary Source="Theme.xaml"/>
      </ResourceDictionary.MergedDictionaries>

      <conv:ErrorContentConverter x:Key="ErrorContentConverter" />

      <Style x:Key="ValidTrigger" 
             TargetType="Control" BasedOn="{StaticResource {x:Type Control}}">
         <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsValid}" Value="False">
              <Setter Property="IsEnabled" Value="false" />
            </DataTrigger>
         </Style.Triggers>
      </Style>   
  </ResourceDictionary>
</UserControl.Resources>

基本テンプレート:

    <Style TargetType="{x:Type Button}" BasedOn="{x:Null}">
    <Setter Property="FocusVisualStyle" 
            Value="{DynamicResource NuclearButtonFocusVisual}" />
    <Setter Property="Foreground" Value="#FF042271" />
    <Setter Property="FontFamily" Value="Trebuchet MS" />
    <Setter Property="FontSize" Value="12" />
    <Setter Property="Padding" Value="3" />

    <Setter Property="Template" Value="{DynamicResource ButtonTemplate}" />
</Style>
22
Marcom

ベーススタイルに名前を付けます(FooStyleなど)。

与えた例では、TargetTypeとBasedOnを次のように変更します。

 <Style x:Key="ValidTrigger" 
        TargetType="{x:Type Control}" BasedOn="{StaticResource {x:Type Control}}" >
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=IsValid}" Value="False">
            <Setter Property="IsEnabled" Value="false" />
        </DataTrigger>
    </Style.Triggers>
</Style>
23
Pieter Müller

私が過去に使用したトリックの1つ:アプリケーションの包括的スタイルを定義するResourceDictionaryで、継承するスタイルにx:Keyを次のように追加します。

<Style TargetType="{x:Type Button}" x:Key="ButtonStyle">
  <!-- your style here -->
</Style>

すべてのButtonStyle属性を明示的に設定せずに、指定されたタイプ(この例ではButton)のすべてのコントロールにこのスタイルを適用するには、このスタイルのBasedOnであるが、キーを持たない別のスタイルを追加します。

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonStyle}" />

このメソッドを使用すると、アプリケーション内のすべてのButtonがカスタムスタイルを自動的に継承しますが、追加のスタイルBasedOnButtonStyleエントリを作成して、すべてのカスタムスタイルを吹き飛ばさないようにすることができます。

25
Nathan Friend

「コントロール」には基本スタイルが定義されていないと思うので、BasedOn="{StaticResource {x:Type Control}}"パーツは何も見つかりません。

あなたはおそらく変更したい

<Style x:Key="ValidTrigger" TargetType="Control" BasedOn="{StaticResource {x:Type Control}}" >

<Style x:Key="ValidTrigger" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" >
2
Mike Schenk