中的樣式繼承 Xamarin.Forms
樣式可以繼承自其他樣式,以減少重複並啟用重複使用。
XAML 中的樣式繼承
樣式繼承是藉由將 Style.BasedOn
屬性設定為現有的 Style
來執行。 在 XAML 中,將 屬性設定 BasedOn
為 StaticResource
參考先前建立 Style
的標記延伸,即可達成此目的。 在 C# 中,藉由將 BasedOn
屬性設定為 Style
實例來達成此目的。
繼承自基底樣式的樣式可以包含 Setter
新屬性的實例,或使用它們來覆寫基底樣式中的樣式。 此外,繼承自基底樣式的樣式必須以相同類型為目標,或是衍生自基底樣式目標類型的類型。 例如,如果基底樣式以實例為目標 View
,則以基底樣式為基礎的樣式可以針對 View
衍生自 View
類別的實例或類型,例如 Label
和 Button
實例。
下列程式代碼示範 XAML 頁面中的明確 樣式繼承:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Styles.StyleInheritancePage" Title="Inheritance" IconImageSource="xaml.png">
<ContentPage.Resources>
<ResourceDictionary>
<Style x:Key="baseStyle" TargetType="View">
<Setter Property="HorizontalOptions"
Value="Center" />
<Setter Property="VerticalOptions"
Value="CenterAndExpand" />
</Style>
<Style x:Key="labelStyle" TargetType="Label"
BasedOn="{StaticResource baseStyle}">
...
<Setter Property="TextColor" Value="Teal" />
</Style>
<Style x:Key="buttonStyle" TargetType="Button"
BasedOn="{StaticResource baseStyle}">
<Setter Property="BorderColor" Value="Lime" />
...
</Style>
</ResourceDictionary>
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout Padding="0,20,0,0">
<Label Text="These labels"
Style="{StaticResource labelStyle}" />
...
<Button Text="So is the button"
Style="{StaticResource buttonStyle}" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
View
目標baseStyle
實例,並設定 HorizontalOptions
和 VerticalOptions
屬性。 baseStyle
不會直接在任何控制項上設定 。 相反地, labelStyle
並 buttonStyle
繼承自它,設定額外的可系結屬性值。 然後,會labelStyle
藉由設定 其Style
屬性,將和 buttonStyle
套用至 Label
實例Button
。 這會導致下列螢幕擷取畫面中顯示的外觀:
注意
隱含樣式可以衍生自明確樣式,但無法從隱含樣式衍生明確樣式。
尊重繼承鏈結
樣式只能繼承於檢視階層中相同層級或更高層級的樣式。 這表示:
- 應用層級資源只能繼承自其他應用層級資源。
- 頁面層級資源可以繼承自應用層級資源,以及其他頁面層級資源。
- 控制層級資源可以繼承自應用層級資源、頁面層級資源,以及其他控制層級資源。
下列程式代碼範例示範此繼承鏈結:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Styles.StyleInheritancePage" Title="Inheritance" IconImageSource="xaml.png">
<ContentPage.Resources>
<ResourceDictionary>
<Style x:Key="baseStyle" TargetType="View">
...
</Style>
</ResourceDictionary>
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout Padding="0,20,0,0">
<StackLayout.Resources>
<ResourceDictionary>
<Style x:Key="labelStyle" TargetType="Label" BasedOn="{StaticResource baseStyle}">
...
</Style>
<Style x:Key="buttonStyle" TargetType="Button" BasedOn="{StaticResource baseStyle}">
...
</Style>
</ResourceDictionary>
</StackLayout.Resources>
...
</StackLayout>
</ContentPage.Content>
</ContentPage>
在此範例中, labelStyle
和 buttonStyle
是控制層級資源,而 baseStyle
是頁面層級資源。 不過,雖然 labelStyle
和 繼承自 baseStyle
,但由於baseStyle
檢視階層中的個別位置,因此無法繼承 或 buttonStyle
labelStyle
。buttonStyle
C 中的樣式繼承#
對等的 C# 頁面,其中 Style
實例會直接指派給 Style
所需控件的屬性,如下列程式代碼範例所示:
public class StyleInheritancePageCS : ContentPage
{
public StyleInheritancePageCS ()
{
var baseStyle = new Style (typeof(View)) {
Setters = {
new Setter {
Property = View.HorizontalOptionsProperty, Value = LayoutOptions.Center },
...
}
};
var labelStyle = new Style (typeof(Label)) {
BasedOn = baseStyle,
Setters = {
...
new Setter { Property = Label.TextColorProperty, Value = Color.Teal }
}
};
var buttonStyle = new Style (typeof(Button)) {
BasedOn = baseStyle,
Setters = {
new Setter { Property = Button.BorderColorProperty, Value = Color.Lime },
...
}
};
...
Content = new StackLayout {
Children = {
new Label { Text = "These labels", Style = labelStyle },
...
new Button { Text = "So is the button", Style = buttonStyle }
}
};
}
}
View
目標baseStyle
實例,並設定 HorizontalOptions
和 VerticalOptions
屬性。 baseStyle
不會直接在任何控制項上設定 。 相反地, labelStyle
並 buttonStyle
繼承自它,設定額外的可系結屬性值。 然後,會labelStyle
藉由設定 其Style
屬性,將和 buttonStyle
套用至 Label
實例Button
。
相關連結
- XAML 標記延伸
- ResourceDictionary \(英文\)
- Style
- Setter