中的 XAML 自定義命名空間架構 Xamarin.Forms
連結庫中的類型可以藉由宣告連結庫的 XAML 命名空間來參考,而命名空間宣告會指定 Common Language Runtime (CLR) 命名空間名稱和元件名稱:
<ContentPage ...
xmlns:controls="clr-namespace:MyCompany.Controls;assembly=MyCompany.Controls">
...
</ContentPage>
不過,在定義中 xmlns
指定CLR命名空間和元件名稱可能會很尷尬且容易出錯。 此外,如果連結庫包含多個命名空間中的類型,可能需要多個 XAML 命名空間宣告。
另一種方法是定義自定義命名空間架構,例如 http://mycompany.com/schemas/controls
對應至一或多個CLR命名空間的自定義命名空間架構。 這可讓單一 XAML 命名空間宣告參考元件中的所有類型,即使它們位於不同的命名空間中也一樣。 它也可讓單一 XAML 命名空間宣告參考多個元件中的類型。
如需 XAML 命名空間的詳細資訊,請參閱 中的 Xamarin.FormsXAML 命名空間。
定義自定義命名空間架構
範例應用程式包含一個連結庫,可公開一些簡單的控件,例如 CircleButton
:
using Xamarin.Forms;
namespace MyCompany.Controls
{
public class CircleButton : Button
{
...
}
}
連結庫中的所有控制件都位於 命名空間中 MyCompany.Controls
。 這些控制項可以透過自定義命名空間架構向呼叫元件公開。
自定義命名空間架構是使用 XmlnsDefinitionAttribute
類別來定義,指定 XAML 命名空間與一或多個 CLR 命名空間之間的對應。 會 XmlnsDefinitionAttribute
採用兩個自變數:XAML 命名空間名稱和 CLR 命名空間名稱。 XAML 命名空間名稱會儲存在 屬性中 XmlnsDefinitionAttribute.XmlNamespace
,而 CLR 命名空間名稱會儲存在 屬性中 XmlnsDefinitionAttribute.ClrNamespace
。
注意
類別 XmlnsDefinitionAttribute
也有名為 AssemblyName
的屬性,其可以選擇性地設定為元件的名稱。 只有在從 參考的 XmlnsDefinitionAttribute
CLR命名空間位於外部元件時,才需要此專案。
XmlnsDefinitionAttribute
應該在專案中的元件層級定義 ,其中包含將在自定義命名空間架構中對應的 CLR 命名空間。 下列範例顯示 範例應用程式中AssemblyInfo.cs 檔案:
using Xamarin.Forms;
using MyCompany.Controls;
[assembly: Preserve]
[assembly: XmlnsDefinition("http://mycompany.com/schemas/controls", "MyCompany.Controls")]
此程式代碼會建立自定義命名空間架構,將 http://mycompany.com/schemas/controls
URL對應至 MyCompany.Controls
CLR命名空間。 此外,會在 Preserve
元件上指定 屬性,以確保連結器會保留元件中的所有類型。
重要
屬性 Preserve
應該套用至透過自定義命名空間架構對應之元件中的類別,或套用至整個元件。
然後,自定義命名空間架構可用於 XAML 檔案中的類型解析。
取用自定義命名空間架構
若要從自定義命名空間架構取用型別,XAML 編譯程式會要求從取用型別的元件,對定義型別的元件有程式代碼參考。 透過將包含 Init
方法的類別新增至定義透過 XAML 取用之型別的元件,即可達成此目的:
namespace MyCompany.Controls
{
public static class Controls
{
public static void Init()
{
}
}
}
Init
然後,可以從取用自定義命名空間架構中型別的元件呼叫 方法:
using Xamarin.Forms;
using MyCompany.Controls;
namespace CustomNamespaceSchemaDemo
{
public partial class MainPage : ContentPage
{
public MainPage()
{
Controls.Init();
InitializeComponent();
}
}
}
警告
無法包含這類程式代碼參考會導致 XAML 編譯程式找不到包含自定義命名空間架構類型的元件。
若要取 CircleButton
用控件,會宣告 XAML 命名空間,並宣告命名空間宣告,並指定自定義命名空間架構 URL:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="http://mycompany.com/schemas/controls"
x:Class="CustomNamespaceSchemaDemo.MainPage">
<StackLayout Margin="20,35,20,20">
...
<controls:CircleButton Text="+"
BackgroundColor="Fuchsia"
BorderColor="Black"
CircleDiameter="100" />
<controls:CircleButton Text="-"
BackgroundColor="Teal"
BorderColor="Silver"
CircleDiameter="70" />
...
</StackLayout>
</ContentPage>
CircleButton
實體接著可以藉由使用controls
命名空間前置詞來宣告實例至 ContentPage
。
若要尋找自定義命名空間架構類型, Xamarin.Forms 將會搜尋 XmlnsDefinitionAttribute
參考的實例元件。 xmlns
如果 XAML 檔案中項目的 屬性符合 XmlNamespace
中的XmlnsDefinitionAttribute
屬性值,Xamarin.Forms將會嘗試使用 XmlnsDefinitionAttribute.ClrNamespace
屬性值來解析型別。 如果類型解析失敗, Xamarin.Forms 將會根據任何其他相符 XmlnsDefinitionAttribute
實例繼續嘗試類型解析。
結果是顯示兩 CircleButton
個實例: