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 对象创建样式,然后将其应用于多种类型的控件(按钮、文本框、复选框等)

<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”为前缀。在第二个中,为 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}"/>

这适用于 Visibility 属性,因为这两个项目都继承自 Frameworkelement 并且该属性是在那里定义的。当然,这不适用于仅在 Control 中定义的属性,您可以搜索层次结构树并尝试找到一个基类,无论如何我认为这可以帮助某人,因为这是一个热门搜索结果,并且选择的答案有点不完整。

于 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 回答