2009-04-29 133 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中定義的屬性不起作用,您可以搜索層次結構樹並嘗試查找基類,無論如何,我認爲這可以幫助某人,因爲這是頂級搜索結果,所選答案有點不完整。

相關問題