2010-09-07 145 views
15

我們剛剛開始使用XAML,並且仍在與基本問題打交道: 從CSS開始,我們希望使用自定義控件模板定義通用按鈕樣式,然後使用「basedon」繼承第一種樣式的所有內容。這第二種風格應該覆蓋屬性,例如「前景色」(工作原理),但也包括我們自定義模板中的子元素的屬性,例如包含邊框元素的「背景顏色」等(不起作用)。如何繼承XAML樣式並覆蓋子元素的屬性?

什麼是一般的方法去了解這樣的事情?能走多遠,我們一起去級聯樣式?

乾杯!

回答

6

製作可定製控件模板的標準方法是在模板中使用TemplateBinding綁定到控件的屬性,然後在子樣式中設置這些屬性。

例如,這將創建一個帶有Border控件的按鈕模板,並將邊框的背景綁定到Button的Background屬性。通過在其他樣式中設置Button的Background屬性,它會更改Border的Background屬性。

<StackPanel> 
    <StackPanel.Resources> 
     <Style x:Key="BaseButtonStyle" TargetType="Button"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Border 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}" 
          Background="{TemplateBinding Background}"> 
          <ContentPresenter/> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     <Style x:Key="BlueButtonStyle" TargetType="Button" 
       BasedOn="{StaticResource BaseButtonStyle}"> 
      <Setter Property="Background" Value="Blue"/> 
     </Style> 
     <Style x:Key="RedButtonStyle" TargetType="Button" 
       BasedOn="{StaticResource BaseButtonStyle}"> 
      <Setter Property="Background" Value="Red"/> 
     </Style> 
    </StackPanel.Resources> 
    <Button Style="{StaticResource RedButtonStyle}">Red</Button> 
    <Button Style="{StaticResource BlueButtonStyle}">Blue</Button> 
</StackPanel> 

Control上的許多屬性都用於控制模板,如果它們發生更改,則不會影響其他行爲。它們是BorderBrush,BorderThickness,Background,Padding,Horizo​​ntalContentAlignment和VerticalContentAlignment。

23

您可以使用繼承的風格,沒有關鍵的參考:在App.xaml中的資源字典定義(在啓動項目)

<Grid> 
    <Grid.Resources> 
     <!-- Definition of default appearance of a button --> 
     <Style TargetType="Button" x:Key="Default"> 
      <Setter Property="Background" Value="Red"></Setter> 
      <Setter Property="FontFamily" Value="Segoe Black" /> 
      <Setter Property="HorizontalAlignment" Value="Center" /> 
      <Setter Property="FontSize" Value="32pt" /> 
      <Setter Property="Foreground" Value="#777777" /> 
     </Style> 
     <!-- Define general style that based is base on the default style of the button without a key reference--> 
     <Style TargetType="Button" BasedOn="{StaticResource Default}"/> 

     <!-- In sub style override the properties you need --> 
     <Style BasedOn="{StaticResource Default}" TargetType="Button" x:Key="SubButton" > 
      <Setter Property="FontSize" Value="8pt" /> 
     </Style> 

    </Grid.Resources> 

    <Button Content="Main" Height="51" HorizontalAlignment="Left" Margin="154,72,0,0" Name="button1" VerticalAlignment="Top" Width="141" /> 
    <Button Content="Sub" Style="{StaticResource SubButton}" Height="51" HorizontalAlignment="Left" Margin="154,162,0,0" Name="button2" VerticalAlignment="Top" Width="141" /> 
</Grid> 
10

我(在我的WPF應用程序)的默認(基地)的風格。例如按鈕如下。

<Style TargetType="Button"> 
     <Setter Property="Margin" Value="5"/> 
     <Setter Property="FontWeight" Value="DemiBold"/> 
     <Setter Property="FontSize" Value="16"/> 
    </Style> 

在我使用的所有視圖(默認情況下)這個一般樣式(自動繼承)!當我需要更改或添加一些默認樣式屬性(在App.xaml中定義)時,我會根據默認樣式創建新樣式。當我需要隱藏或強烈地重新定義默認樣式(在某些視圖中)時,我創建了新樣式(根據什麼都不做)。

<Style TargetType="Button"/> 

當然,您可以繼續繼承App.xaml或特定視圖。您可以根據默認樣式命名爲,並命名爲樣式,並按名稱使用新樣式。例如RedButton和GreenButton樣式。

<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" x:Key="RedButton"> 
     <Setter Property="Foreground" Value="Red" /> 
    </Style> 

    <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" x:Key="GreenButton"> 
     <Setter Property="Foreground" Value="Green" /> 
    </Style> 

等...

注:,而不是定義的App.xaml你的風格,你可以只用和風格的ResourceDictionary從庫的App.xaml ResourceDictionary.MergedDictionaries使用獨立的庫(DLL) 。