你能为一个XAML风格定义多个TargetType吗?

在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?

在编译期间检查WPF样式的setter; CSS样式是dynamic应用的。

您必须指定一个types,以便WPF可以将设置器中的属性parsing为该types的依赖项属性。

您可以将目标types设置为包含所需属性的基类,然后将该样式应用于派生类。 例如,您可以为Control对象创build一个样式,然后将其应用于多种types的控件(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"/> 
 <!-- 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对象创build的。

另一种方法是:

 <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> 

这个问题有另外一个答案。 您可以将TargetType参数完全closures,这将允许它应用于各种不同的控件,但前提是您使用“Control”作为属性名称的前缀。

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

显然,这只适用于基本控件类的属性。 如果你试图设置ItemsSource说,它会失败,因为没有Control.ItemsSource

我想将样式应用于Textblock和TextBox,但所选的答案不适用于我,因为Textblock不能从Controlinheritance,在我的情况下我想影响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属性,因为这两个项目都从Frameworkelementinheritance,并且在那里定义了属性。 当然这对于仅在Control中定义的属性不起作用,您可以search层次结构树并尝试查找基类,无论如何,我认为这可以帮助某个人,因为这是顶级search结果,所选答案有点不完整。

我得到了这个工作

 <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>