我們剛剛開始使用XAML,並且仍在與基本問題打交道: 從CSS開始,我們希望使用自定義控件模板定義通用按鈕樣式,然後使用「basedon」繼承第一種樣式的所有內容。這第二種風格應該覆蓋屬性,例如「前景色」(工作原理),但也包括我們自定義模板中的子元素的屬性,例如包含邊框元素的「背景顏色」等(不起作用)。如何繼承XAML樣式並覆蓋子元素的屬性?
什麼是一般的方法去了解這樣的事情?能走多遠,我們一起去級聯樣式?
乾杯!
我們剛剛開始使用XAML,並且仍在與基本問題打交道: 從CSS開始,我們希望使用自定義控件模板定義通用按鈕樣式,然後使用「basedon」繼承第一種樣式的所有內容。這第二種風格應該覆蓋屬性,例如「前景色」(工作原理),但也包括我們自定義模板中的子元素的屬性,例如包含邊框元素的「背景顏色」等(不起作用)。如何繼承XAML樣式並覆蓋子元素的屬性?
什麼是一般的方法去了解這樣的事情?能走多遠,我們一起去級聯樣式?
乾杯!
製作可定製控件模板的標準方法是在模板中使用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,HorizontalContentAlignment和VerticalContentAlignment。
您可以使用繼承的風格,沒有關鍵的參考:在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>
我(在我的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) 。