2009-04-29 4 views
51

あなたが要素、例えば、多くの種類に適用することができ、スタイルを定義することができます。1つのXAMLスタイルに対して複数のTargetTypesを定義できますか? HTML/CSSで

.highlight { 
    color:red; 
} 

は例えば、PやDIVの両方に適用することができます。

<p class="highlight">this will be highlighted</p> 
<div class="highlight">this will also be highlighted</div> 

が、中あなたがそうでなければ、あなたがエラーを取得し、スタイルのためのTargetTypeを定義するために持っているように見えるXAML:

<Style x:Key="formRowLabel" TargetType="TextBlock"> 

は、XAMLスタイルが複数の要素または電子に適用することができるようにする方法がありますCSSのように開いておくようにしますか?

答えて

59

WPFスタイルのセッターは、コンパイル時にチェックされます。 CSSスタイルは動的に適用されます。

WPFがsetterのプロパティをその型の依存関係プロパティに解決できるように、型を指定する必要があります。

目的のタイプを目的のプロパティを含むベースクラスに設定し、そのスタイルを派生クラスに適用することができます。たとえば、あなたがコントロールオブジェクトのスタイルを作成し、複数のコントロールの種類(ボタン、テキストボックス、チェックボックスなど)

<Style x:Key="Highlight" TargetType="{x:Type Control}"> 
    <Setter Property="Foreground" Value="Red"/> 
</Style> 

にそれを適用することができ...

<Button Style="{StaticResource Highlight}" Content="Test"/> 
<TextBox Style="{StaticResource Highlight}" Text="Test"/> 
<CheckBox Style="{StaticResource Highlight}" Content="Test"/> 
+0

ボタンとテキストボックスには適用しますが、チェックボックスには適用しません。 –

+1

あなたはそれをあなたが望むものにでも適用することができます。このスタイルはコントロールに適用する必要があります。 'x:Key = "Highlight"'を削除すると、Ifはすべてのコントロールにのみ適用されます。チェックボックスに適用しない場合は、 'Style ='プロパティをそのままにしておきます。 –

+3

明確化: 'x:Key = "Highlight"をスタイル定義から削除して、そのタイプのすべてのインスタンスにスタイルを適用します。キーを使用して、コントロールからスタイルを削除するには、コントロールから 'Style = "{StaticResource Highlight}"'を削除します。 –

-2

私はこの作業を得ました

<Style x:Key="HeaderStyleThin" TargetType="{x:Type Border}"> 
    <Setter Property="Background" Value="Black" /> 

    <Style.Resources> 
     <Style TargetType="{x:Type TextBlock}"> 
       <Setter Property="Background=" Value="Red" /> 
     </Style> 
     </Style.Resources> 

</Style> 
3

質問に対する代替の回答があります。 TargetTypeパラメータをスタイルから完全に離しておくことができます。これにより、プロパティ名の前に「Control」というプレフィックスを付けた場合にのみ、さまざまなコントロールに適用できます。

<Style x:Key="Highlight"> 
    <Setter Property="Control.Foreground" Value="Red"/> 
</Style> 

明らかに、これは基本コントロールクラスのプロパティでのみ機能します。あなたが言うのItemsSourceを設定しようとした場合は何もControl.ItemsSource

+1

これを行うことで、あなたはTargetTypeを暗示的に示しています。あなたが言うように、それが適用される要素がコントロールである場合にのみ動作します。したがって、これは、TargetTypeをControlに設定したままにしておくことはありません。 –

29
<!-- Header text style --> 
<Style x:Key="headerTextStyle"> 
    <Setter Property="Label.VerticalAlignment" Value="Center"></Setter> 
    <Setter Property="Label.FontFamily" Value="Trebuchet MS"></Setter> 
    <Setter Property="Label.FontWeight" Value="Bold"></Setter> 
    <Setter Property="Label.FontSize" Value="18"></Setter> 
    <Setter Property="Label.Foreground" Value="#0066cc"></Setter> 
</Style> 

<!-- Label style --> 
<Style x:Key="labelStyle" TargetType="{x:Type Label}"> 
    <Setter Property="VerticalAlignment" Value="Top" /> 
    <Setter Property="HorizontalAlignment" Value="Left" /> 
    <Setter Property="FontWeight" Value="Bold" /> 
    <Setter Property="Margin" Value="0,0,0,5" /> 
</Style> 

がないので、それは失敗するでしょう、私はスタイルを宣言するこれらの方法の両方を考えるあなたの質問に答えるかもしれません。 最初のものでは、TargetTypeは指定されていませんが、プロパティ名には 'Label'という接頭辞が付きます。 2番目のスタイルでは、Labelオブジェクトのスタイルが作成されます。

それを行うための別の方法は次のとおりです。

<UserControl.Resources> 
    <Style x:Key="commonStyle" TargetType="Control"> 
    <Setter Property="FontSize" Value="24"/> 
    </Style> 
    <Style BasedOn="{StaticResource commonStyle}" TargetType="ListBox"/> 
    <Style BasedOn="{StaticResource commonStyle}" TargetType="ComboBox"/> 
</UserControl.Resources> 
+0

headerTextStyleは、Labelとそれから派生したクラスにしか適用できないため、TargetTypeをそのままにすることはできません。 –

+0

@スティーブ:これはあなたの疑問に答えるかもしれないと思います。 – Gaurang

+0

最初の例では、 'Label'を' UIElement'に置き換えて、一般的に複数のタイプのコントロール間で動作させることができます。 – Julien

2

私はTextBlockのとテキストボックスが、TextBlockのコントロールから継承していないため、選択した答えは私のために動作しませんでした、中にスタイルを適用したいです私の場合は私がVisibilityプロパティに影響を与えたいと思ったので、私は両方のアイテムがFrameworkElementから継承するため、これは、Visibilityプロパティのために働くとプロパティが定義されたFrameworkElement

<Style x:Key="ShowIfRequiredStyle" TargetType="{x:Type FrameworkElement}"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ShowIfRequiredStyle, UpdateSourceTrigger=PropertyChanged}" Value="true"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
</Style> 

<TextBlock Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/> 
<TextBox Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/> 

を使用しました。もちろん、これはコントロール内でのみ定義されたプロパティでは機能しません。階層ツリーを検索して基本クラスを見つけようとしますが、これは上位の検索結果であり、選択された回答が少し不完全であるためです。

+1

はいTargetType = "{x:Type FrameworkElement}"は私のために働いていましたが、 –

関連する問題