Язык программирования C#9 и платформа .NET5
</Page>Первое пространство имен XML,
, отображает множество связанных c WPF пространств имен .NET для использования текущим файломhttp://schemas.microsoft.com/winfx/2006/xaml/presentation(*.xaml,System.Windows,System.Windows.Controls,System.Windows.Data,System.Windows.Ink,System.Windows.Mediaи т.д.).System.Windows.NavigationЭто отображение "один ко многим" в действительности жестко закодировано внутри сборок WPF (
,WindowsBase.dllиPresentationCore.dll) с применением атрибутаPresentationFramework.dllуровня сборки. Например, если открыть браузер объектов Visual Studio и выбрать сборку[XmlnsDefinition], то можно увидеть списки, подобные показанному ниже, в котором импортируется пространство именPresentationCore.dll:System.Windows[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation","System.Windows")]Второе пространство имен XML,
, используется для добавления специфичных для XAML "ключевых слов" (термин выбран за неимением лучшего), а также пространства именhttp://schemas.microsoft.com/winfx/2006/xaml:System.Windows.Markup[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml","System.Windows.Markup")]Одно из правил любого корректно сформированного документа XML (не забывайте, что грамматика XAML основана на XML) состоит в том, что открывающий корневой элемент назначает одно пространство имен XML в качестве первичного пространства имен, которое обычно представляет собой пространство имен, содержащее самые часто применяемые элементы. Если корневой элемент требует включения дополнительных вторичных пространств имен (как видно здесь), то они должны быть определены с использованием уникального префикса (чтобы устранить возможные конфликты имен). По соглашению для префикса применяется просто
, однако он может быть любым уникальным маркером, таким какх:XamlSpecificStuff<Pagexmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:<b>XamlSpecificStuff</b>="http://schemas.microsoft.com/winfx/2006/xaml"><Grid><!-- Кнопка со специальным содержимым --><Button <b>XamlSpecificStuff</b>:Name="button1" Height="100" Width="100"><Ellipse Fill="Green" Height="50" Width="50"/></Button></Grid></Page>Очевидный недостаток определения длинных префиксов для пространств имен XML связан с тем, что
придется набирать всякий раз, когда в файле XAML нужно сослаться на один из элементов, определенных в этом пространстве имен XML. Из-за того, что префиксXamlSpecificStuffнамного длиннее, давайте ограничимсяXamlSpecificStuff.хПомимо ключевых слов
,x:Nameих:Classпространство именx:Codeтакже предоставляет доступ к дополнительным ключевым словам XAML, наиболее распространенные из которых кратко описаны в табл. 24.9.http://schemas.microsoft.com/winfх/2006/xamlВ дополнение к двум указанным объявлениям пространств имен XML можно (а иногда и нужно) определить дополнительные префиксы дескрипторов в открывающем элементе документа XAML. Обычно так поступают, когда необходимо описать в XAML класс .NET Core, определенный во внешней сборке.
Например, предположим, что было построено несколько специальных элементов управления WPF, которые упакованы в библиотеку по имени
. Если теперь требуется создать новый объект Window, в котором применяются созданные элементы, то можно установить специальное пространство имен XML, отображаемое на библиотекуMyControls.dll, с использованием маркеровMyControls.dllиclr-namespace. Ниже приведен пример разметки, создающей префикс дескриптора по имениassembly, который может применяться для доступа к элементам управления в этой библиотеке:myCtrls<Window x:Class="WpfApplication1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"<b> xmlns:myCtrls="clr-namespace:MyControls;assembly=MyControls"</b>Title="MainWindow" Height="350" Width="525"><Grid><b> <myCtrls:MyCustomControl /></b></Grid></Window>Маркеру
назначается название пространства имен .NET Core в сборке, в то время как маркерclr-namespaceустанавливается в дружественное имя внешней сборкиassembly. Такой синтаксис можно использовать для любой внешней библиотеки .NET Core, которой желательно манипулировать внутри разметки. В настоящее время в этом нет необходимости, но в последующих главах понадобится определять специальные объявления пространств имен XML для описания типов в разметке.*.dll
