自訂命名空間結構描述
.NET 多平臺應用程式 UI (.NET MAUI) 連結庫中的類型可以在 XAML 中參考,方法是宣告連結庫的 XML 命名空間,並指定 Common Language Runtime (CLR) 命名空間名稱和元件名稱的命名空間宣告:
<ContentPage ...
xmlns:controls="clr-namespace:MyCompany.Controls;assembly=MyCompany.Controls">
...
</ContentPage>
不過,在定義中 xmlns
指定CLR命名空間和元件名稱可能會很尷尬且容易出錯。 此外,如果連結庫包含多個命名空間中的類型,可能需要多個 XML 命名空間宣告。
另一種方法是定義自定義命名空間架構,例如 http://mycompany.com/schemas/controls
對應至一或多個CLR命名空間的自定義命名空間架構。 這可讓單一 XML 命名空間宣告參考元件中的所有類型,即使它們位於不同的命名空間中也一樣。 它也可讓單一 XML 命名空間宣告參考多個元件中的型別。
如需 XAML 命名空間的詳細資訊,請參閱 XAML 命名空間。
定義自定義命名空間架構
想像一下公開一些簡單控件的連結庫,例如 CircleButton
:
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 命名空間:
using MyCompany.Controls;
[assembly: XmlnsDefinition("http://mycompany.com/schemas/controls", "MyCompany.Controls")]
此程式代碼會建立自定義命名空間架構,將 http://mycompany.com/schemas/controls
URL對應至 MyCompany.Controls
CLR命名空間。
重要
您應該指示連結器保留透過自定義命名空間架構對應之元件中的類型,或保留整個元件。 如需詳細資訊,請參閱 保留程序代碼。
然後,自定義命名空間架構可用於 XAML 檔案中的類型解析。
取用自定義命名空間架構
若要從自定義命名空間架構取用型別,XAML 編譯程式會要求從取用型別的元件,對定義型別的元件有程式代碼參考。 透過將包含 Init
方法的類別新增至定義透過 XAML 取用之型別的元件,即可達成此目的:
namespace MyCompany.Controls
{
public static class Controls
{
public static void Init()
{
}
}
}
Init
然後,可以從取用自定義命名空間架構中型別的元件呼叫 方法:
using MyCompany.Controls;
namespace CustomNamespaceSchemaDemo
{
public partial class MainPage : ContentPage
{
public MainPage()
{
Controls.Init();
InitializeComponent();
}
}
}
警告
無法包含這類程式代碼參考會導致 XAML 編譯程式找不到包含自定義命名空間架構類型的元件。
若要取 CircleButton
用控件,會宣告 XAML 命名空間,並宣告命名空間宣告,並指定自定義命名空間架構 URL:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="http://mycompany.com/schemas/controls"
x:Class="CustomNamespaceSchemaDemo.MainPage">
<StackLayout>
...
<controls:CircleButton Text="+"
BackgroundColor="Fuchsia"
BorderColor="Black"
CircleDiameter="100" />
<controls:CircleButton Text="-"
BackgroundColor="Teal"
BorderColor="Silver"
CircleDiameter="70" />
...
</StackLayout>
</ContentPage>
CircleButton
實體接著可以藉由使用controls
命名空間前置詞來宣告實例至 ContentPage 。
若要尋找自定義命名空間架構類型,.NET MAUI 會搜尋 XmlnsDefinitionAttribute
參考的實例元件。 xmlns
如果 XAML 檔案中項目的 屬性符合 XmlNamespace
中的XmlnsDefinitionAttribute
屬性值,.NET MAUI 會嘗試使用 XmlnsDefinitionAttribute.ClrNamespace
屬性值來解析型別。 如果類型解析失敗,.NET MAUI 會繼續根據任何其他相符 XmlnsDefinitionAttribute
實例嘗試類型解析。
結果是顯示兩 CircleButton
個實例: