Xamarin.Forms樣式簡介
樣式允許自定義視覺元素的外觀。 樣式是針對特定類型所定義,並包含該類型上可用屬性的值。
Xamarin.Forms 應用程式通常包含多個具有相同外觀的控制件。 例如,應用程式可能會有多個 Label
具有相同字型選項和版面配置選項的實例,如下列 XAML 程式代碼範例所示:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Styles.NoStylesPage"
Title="No Styles"
IconImageSource="xaml.png">
<ContentPage.Content>
<StackLayout Padding="0,20,0,0">
<Label Text="These labels"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand"
FontSize="Large" />
<Label Text="are not"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand"
FontSize="Large" />
<Label Text="using styles"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand"
FontSize="Large" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
下列程式碼範例示範以 C# 建立的相等頁面:
public class NoStylesPageCS : ContentPage
{
public NoStylesPageCS ()
{
Title = "No Styles";
IconImageSource = "csharp.png";
Padding = new Thickness (0, 20, 0, 0);
Content = new StackLayout {
Children = {
new Label {
Text = "These labels",
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.CenterAndExpand,
FontSize = Device.GetNamedSize (NamedSize.Large, typeof(Label))
},
new Label {
Text = "are not",
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.CenterAndExpand,
FontSize = Device.GetNamedSize (NamedSize.Large, typeof(Label))
},
new Label {
Text = "using styles",
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.CenterAndExpand,
FontSize = Device.GetNamedSize (NamedSize.Large, typeof(Label))
}
}
};
}
}
每個 Label
實例都有相同的屬性值,可控制 所 Label
顯示的文字外觀。 這會導致下列螢幕擷取畫面中顯示的外觀:
設定每個個別控件的外觀可能會重複且容易發生錯誤。 相反地,可以建立定義外觀的樣式,然後套用至必要的控件。
建立樣式
Style
類別會將屬性值的集合分組到一個物件中,然後套用到多個視覺元素執行個體。 這有助於減少重複標記,並讓應用程式外觀更容易變更。
雖然樣式主要是針對以 XAML 為基礎的應用程式所設計,但它們也可以在 C# 中建立:
Style
在 XAML 中建立的實體通常會定義在ResourceDictionary
指派給Resources
控件、頁面或Resources
應用程式集合集合的 中。Style
在 C# 中建立的實體通常會定義於頁面的 類別中,或定義於可全域存取的類別中。
選擇要在何處定義 Style
會影響其可使用的位置:
每個 Style
執行個體都包含一或多個 Setter
物件的集合,其中每個 Setter
都有一項 Property
及一個 Value
。 Property
為樣式所套用元素的可繫結屬性名稱,且 Value
為套用至屬性的值。
每個Style
實體都可以明確或隱含:
- 明確
Style
實例的定義方式是指定TargetType
和x:Key
值,並將目標元素的Style
屬性設定為x:Key
參考。 如需明確樣式的詳細資訊,請參閱明確樣式。 - 隱含
Style
實例是藉由只TargetType
指定 來定義。 然後,Style
實例會自動套用至該類型的所有專案。 請注意,的TargetType
子類別不會自動Style
套用 。 如需隱含樣式的詳細資訊,請參閱隱含樣式。
建立 Style
時,一律需要 TargetType
屬性。 下列程式代碼範例示範在 XAML 中建立的 明確 樣式(請注意 x:Key
) :
<Style x:Key="labelStyle" TargetType="Label">
<Setter Property="HorizontalOptions" Value="Center" />
<Setter Property="VerticalOptions" Value="CenterAndExpand" />
<Setter Property="FontSize" Value="Large" />
</Style>
若要套用 Style
,目標對象必須是 VisualElement
符合 TargetType
屬性值的 Style
,如下列 XAML 程式代碼範例所示:
<Label Text="Demonstrating an explicit style" Style="{StaticResource labelStyle}" />
檢視階層中較低樣式的優先順序高於較高定義的樣式。 例如, Style
將 設定 Label.TextColor
在應用層級設定為 Red
的 ,將會由設定 Label.TextColor
為 Green
的頁面層級樣式覆寫。 同樣地,頁面層級樣式會由控件層級樣式覆寫。 此外,如果 Label.TextColor
直接在控件屬性上設定,這會優先於任何樣式。
本節中的文章示範及說明如何建立和套用 明確 和 隱含 樣式、如何建立全域樣式、樣式繼承、如何在運行時間響應樣式變更,以及如何使用 內 Xamarin.Forms建的樣式。
注意
什麼是 StyleId?
在 Xamarin.Forms 2.2 之前, StyleId
屬性是用來識別應用程式中的個別元素,以在 UI 測試中識別,以及在 Pixate 等主題引擎中。 不過, Xamarin.Forms 2.2 引進 AutomationId
了 已取代 屬性的屬性 StyleId
。