第 7 章的摘要。 XAML 與程式碼
注意
這本書於2016年春季出版,此後一直沒有更新。 這本書中有很多仍然有價值,但一些材料已經過時,有些主題不再完全正確或完整。
Xamarin.Forms 支援稱為 Extensible Application Markup Language 或 XAML 的 XML 標記語言(發音為 “zammel” )。 XAML 在定義應用程式的使用者介面配置,以及在定義使用者介面 Xamarin.Forms 元素與基礎數據之間的系結時,XAML 提供 C# 的替代方案。
屬性和屬性
Xamarin.Forms 類別和結構會成為 XAML 中的 XML 元素,而這些類別和結構的屬性會變成 XML 屬性。 若要在 XAML 中具現化,類別通常必須具有公用無參數建構函式。 XAML 中設定的任何屬性都必須具有公用 set
存取子。
針對基本數據類型的屬性(string
、、 double
bool
等),XAML 剖析器會使用標準TryParse
方法,將屬性設定轉換成這些類型。 XAML 剖析器也可以輕鬆地處理列舉型別,如果列舉型別已加上 Flags
屬性旗標,它可以結合列舉成員。
為了協助 XAML 剖析器,更複雜的型別(或這些型別的屬性)可以包含 TypeConverterAttribute
識別衍生 TypeConverter
自 的類別,該類別支援從字串值轉換成這些型別。 例如,會將 ColorTypeConverter
色彩名稱和字串,例如 「#rrggbb」 轉換成 Color
值。
Property-element 語法
在 XAML 中,類別和從它們建立的物件會以 XML 元素表示。 這些稱為 物件專案。 這些物件的大部分屬性都會以 XML 屬性表示。 這些稱為 屬性屬性。
有時候,屬性必須設定為不能以簡單字串表示的物件。 在這種情況下,XAML 支援稱為 屬性元素 的標記,其中包含以句點分隔的類別名稱和屬性名稱。 然後,對象專案可以出現在一組屬性項目標記內。
將 XAML 頁面新增至您的專案
Xamarin.Forms可攜式類別庫可以在第一次建立 XAML 頁面時包含 XAML 頁面,也可以將 XAML 頁面新增至現有的專案。 在要加入新項目的對話框中,選擇參考 XAML 頁面或 ContentPage
XAML 的專案。 (不是。ContentView
注意
自本章撰寫以來,Visual Studio 選項已變更。
系統會建立兩個檔案:擴展名為 .xaml 的 XAML 檔案,以及擴展名為 .xaml.cs 的 C# 檔案。 C# 檔案通常稱為 XAML 檔案的程式代碼後置 。 程序代碼後置檔案是衍生自 ContentPage
的部分類別定義。 在建置階段,會剖析 XAML,並針對同一類別產生另一個部分類別定義。 這個產生的類別包含名為 InitializeComponent
的方法,這個方法是從程式代碼後置檔案的建構函式呼叫。
在運行時間期間,在呼叫結束時 InitializeComponent
,XAML 檔案的所有元素都已具現化並初始化,就像是在 C# 程式代碼中建立一樣。
XAML 檔案中的根元素為 ContentPage
。 根標記至少包含兩個 XML 命名空間宣告,一個用於 Xamarin.Forms 元素,另一個 x
定義所有 XAML 實作內建的元素和屬性前置詞。 根標記也包含 x:Class
屬性,指出衍生自 ContentPage
之類別的命名空間和名稱。 這會比對程式代碼後置檔案中的命名空間和類別名稱。
CODEPlusXaml 範例示範 XAML 和程式代碼的組合。
XAML 編譯程式
Xamarin.Forms 具有 XAML 編譯程式,但其使用是選擇性的,根據的 XamlCompilationAttribute
用法。 如果未編譯 XAML,則會在建置階段剖析 XAML,而 XAML 檔案會內嵌在 PCL 中,而該檔案也會在運行時間剖析。 如果編譯 XAML,建置程式會將 XAML 轉換成二進位格式,而且運行時間處理更有效率。
XAML 檔案中的平臺特定性
在 XAML 中,類別 OnPlatform
可用來選取平臺相依標記。 這是泛型類別,而且必須使用符合目標類型的屬性具現化 x:TypeArguments
。 類別 OnIdiom
很類似,但較不常使用。
自這本書出版以來, OnPlatform
的使用發生了變化。 它原本與名為 iOS
、 Android
和 WinPhone
的屬性搭配使用。 它現在會與子 On
物件搭配使用。 將 Platform
屬性設定為與 類別公用const
Device
字段一致的字串。 將 Value
屬性設定為與 x:TypeArguments
標記屬性 OnPlatform
一致的值。
OnPlatform
在 ScaryColorList 範例中示範,因此稱為 ,因為它包含幾乎完全相同的 XAML 區塊。 這種重複標記的存在表明,應該提供技術來減少它。
content 屬性屬性
某些屬性元素經常發生,例如 <ContentPage.Content>
的根元素 ContentPage
上的標記,或 <StackLayout.Children>
封入 子系的 StackLayout
標記。
每個類別都可以使用 類別上的 來識別一個屬性 ContentPropertyAttribute
。 針對這個屬性,不需要 property-element 標記。 ContentPage
將內容屬性定義為 Content
,而 Layout<T>
(衍生自的 StackLayout
類別) 會將其內容屬性 Children
定義為 。 不需要這些屬性元素標記。
屬性項目 Label
為 Text
。
格式化文字
TextVariations 範例包含數個Text
設定 和 FormattedText
屬性的Label
範例。 在 XAML 中, Span
對象會顯示為物件的子系 FormattedString
。
當多行字串設定為 Text
屬性時,行尾字元會轉換成空格字元,但是當多行字串顯示為 或 Label.Text
標記的內容Label
時,會保留行尾字元: