共用方式為


中的樣式繼承 Xamarin.Forms

樣式可以繼承自其他樣式,以減少重複並啟用重複使用。

XAML 中的樣式繼承

樣式繼承是藉由將 Style.BasedOn 屬性設定為現有的 Style來執行。 在 XAML 中,將 屬性設定 BasedOnStaticResource 參考先前建立 Style的標記延伸,即可達成此目的。 在 C# 中,藉由將 BasedOn 屬性設定為 Style 實例來達成此目的。

繼承自基底樣式的樣式可以包含 Setter 新屬性的實例,或使用它們來覆寫基底樣式中的樣式。 此外,繼承自基底樣式的樣式必須以相同類型為目標,或是衍生自基底樣式目標類型的類型。 例如,如果基底樣式以實例為目標 View ,則以基底樣式為基礎的樣式可以針對 View 衍生自 View 類別的實例或類型,例如 LabelButton 實例。

下列程式代碼示範 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實例,並設定 HorizontalOptionsVerticalOptions 屬性。 baseStyle不會直接在任何控制項上設定 。 相反地, labelStylebuttonStyle 繼承自它,設定額外的可系結屬性值。 然後,會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>

在此範例中, labelStylebuttonStyle 是控制層級資源,而 baseStyle 是頁面層級資源。 不過,雖然 labelStyle 和 繼承自 baseStyle,但由於baseStyle檢視階層中的個別位置,因此無法繼承 或 buttonStylelabelStylebuttonStyle

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實例,並設定 HorizontalOptionsVerticalOptions 屬性。 baseStyle不會直接在任何控制項上設定 。 相反地, labelStylebuttonStyle 繼承自它,設定額外的可系結屬性值。 然後,會labelStyle藉由設定 其Style屬性,將和 buttonStyle 套用至 Label 實例Button