共用方式為


第 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、、 doublebool等),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 的使用發生了變化。 它原本與名為 iOSAndroidWinPhone的屬性搭配使用。 它現在會與子 On 物件搭配使用。 將 Platform 屬性設定為與 類別公用constDevice字段一致的字串。 將 Value 屬性設定為與 x:TypeArguments 標記屬性 OnPlatform 一致的值。

OnPlatform在 ScaryColorList 範例中示範,因此稱為 ,因為它包含幾乎完全相同的 XAML 區塊。 這種重複標記的存在表明,應該提供技術來減少它。

content 屬性屬性

某些屬性元素經常發生,例如 <ContentPage.Content> 的根元素 ContentPage上的標記,或 <StackLayout.Children> 封入 子系的 StackLayout標記。

每個類別都可以使用 類別上的 來識別一個屬性 ContentPropertyAttribute 。 針對這個屬性,不需要 property-element 標記。 ContentPage 將內容屬性定義為 Content,而 Layout<T> (衍生自的 StackLayout 類別) 會將其內容屬性 Children定義為 。 不需要這些屬性元素標記。

屬性項目 LabelText

格式化文字

TextVariations 範例包含數個Text設定 和 FormattedText 屬性的Label範例。 在 XAML 中, Span 對象會顯示為物件的子系 FormattedString

當多行字串設定為 Text 屬性時,行尾字元會轉換成空格字元,但是當多行字串顯示為 或 Label.Text 標記的內容Label時,會保留行尾字元:

文字變化共用的三重螢幕快照