2009-04-29 130 views
51

在HTML/CSS,你可以定义可以适用于多种类型元素的风格,例如:您可以为一种XAML样式定义多个TargetType吗?

.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一样打开?

回答

59

在编译时检查WPF样式中的setter;动态应用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

是的但如果你想将它应用到按钮和文本框而不是复选框会怎样? – 2009-06-22 13:45:57

+1

你可以将它应用于任何你想要的。这种风格必须应用于控件。如果只删除'x:Key ='突出显示'',将只适用于所有控件。如果您不希望将其应用于CheckBoxes,请关闭“Style =”属性。 – 2009-06-22 16:25:03

+3

澄清:从样式定义中删除'x:Key ='突出显示''以将样式应用于该类型的所有实例。使用该键,从控件中删除'Style =“{StaticResource Highlight}”',以从该控件中删除样式。 – 2009-06-22 16:26:23

-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

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”作为前缀。在第二个中,样式是为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> 
2

我想一个样式应用到一个文本块和一个TextBox,但所选择的答案并没有为我工作,因为文字块不从控制继承,在我的情况,我想影响能见度的财产,所以我用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继承和属性被定义在那里。当然,这对于仅在Control中定义的属性不起作用,您可以搜索层次结构树并尝试查找基类,无论如何,我认为这可以帮助某人,因为这是顶级搜索结果,所选答案有点不完整。

相关问题