73

HTML/CSS では、さまざまな種類の要素に適用できるスタイルを定義できます。たとえば、次のようになります。

.highlight {
    color:red;
}

P と DIV の両方に適用できます。例:

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

ただし、XAML では、スタイルの TargetType を定義する必要があるようです。そうしないと、エラーが発生します。

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

XAML スタイルを複数の要素に適用したり、CSS のように開いたままにしたりする方法はありますか?

4

5 に答える 5

77

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

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

必要なプロパティを含む基本クラスにターゲット型を設定し、そのスタイルを派生クラスに適用できます。たとえば、Control オブジェクトのスタイルを作成し、それを複数のタイプのコントロール (Button、TextBox、CheckBox など) に適用できます。

<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"/>
于 2009-04-29T14:47:39.107 に答える
50
<!-- 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>
于 2012-10-15T05:57:27.800 に答える
7

Textblock と TextBox にスタイルを適用したかったのですが、Textblock は Control から継承されないため、選択した答えはうまくいきませんでした。私の場合、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}"/>

両方の項目が Frameworkelement から継承され、そこでプロパティが定義されているため、これは Visibility プロパティに対して機能します。もちろん、これはコントロールでのみ定義されたプロパティでは機能しません。階層ツリーを検索して基本クラスを見つけようとすることができます。とにかく、これはトップの検索結果であり、選択された回答は少し不完全であるため、誰かを助けることができると思いました.

于 2015-08-13T18:26:41.897 に答える
3

質問には別の答えがあります。スタイルから TargetType パラメーターを完全に除外して、さまざまな異なるコントロールに適用できるようにすることができますが、プロパティ名の前に「Control」を付けた場合に限ります。

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

明らかに、これは基本コントロール クラスのプロパティに対してのみ機能します。たとえば、ItemsSource を設定しようとすると、Control.ItemsSource がないため失敗します。

于 2012-07-02T15:31:48.110 に答える
-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>
于 2011-11-15T13:49:37.003 に答える