共用方式為


中的 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 個實例:

圓形按鈕