Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Области имен XAML — это концепция, которая определяет объекты, определенные в XAML. Имена в области имен XAML можно использовать для установления связей между определенными XAML именами объектов и их эквивалентами экземпляров в дереве объектов. Как правило, области имен XAML в управляемом коде WPF создаются при загрузке отдельных корней страниц XAML для приложения XAML. Области имен XAML в качестве объекта программирования определяются интерфейсом INameScope , а также реализуются практическим классом NameScope.
Области пространства имен в загруженных приложениях XAML
В более широком контексте программирования или компьютерной науки концепции программирования часто включают принцип уникального идентификатора или имени, который можно использовать для доступа к объекту. Для систем, использующих идентификаторы или имена, область имен определяет границы, в которых выполняется поиск процесса или метода, если запрашивается объект этого имени, или границы, в которых применяется уникальность идентификации имен. Эти общие принципы верны для пространств имен XAML. В WPF области имен XAML создаются на корневом элементе страницы XAML при загрузке страницы. Каждое имя, указанное на странице XAML, начиная с корня страницы, добавляется в соответствующую область имен XAML.
В XAML WPF элементы, которые являются общими корневыми элементами (например Page, и Window) всегда управляют областью имен XAML. Если элемент, такой как FrameworkElement или FrameworkContentElement, является корневым элементом страницы в разметке, обработчик XAML неявно добавляет корневой элемент Page, чтобы Page смог предоставить рабочую область имен XAML.
Замечание
Действия сборки WPF создают область имен XAML для создания XAML, даже если атрибуты Name или x:Name не определены на элементах в разметке XAML.
При попытке использовать одно и то же имя дважды в любой области имен XAML возникает исключение. Для XAML WPF, который имеет поддерживающий код и является частью скомпилированного приложения, исключение возникает в момент сборки WPF при создании генерируемого класса страницы во время первоначальной компиляции разметки. Для XAML, который не компилируется с помощью каких-либо действий сборки, при загрузке XAML могут возникать исключения, связанные с проблемами с областью имен XAML. Конструкторы XAML также могут предвидеть проблемы с областью имен XAML во время разработки.
Добавление объектов в деревья объектов среды выполнения
Момент, когда происходит разбор XAML, представляет собой момент создания и определения пространства имён XAML для WPF. При добавлении объекта в дерево объектов после того, как XAML, создавший это дерево, был проанализирован, Name или x:Name значение нового объекта не обновляет автоматически сведения в области имен XAML. Чтобы добавить имя объекта в область имен WPF XAML после загрузки XAML, необходимо вызвать соответствующую реализацию RegisterName объекта, определяющего область имен XAML, которая обычно является корнем страницы XAML. Если имя не зарегистрировано, добавленный объект нельзя ссылаться по имени с помощью таких методов, как, например FindName, и вы не можете использовать это имя для указания цели анимации.
Наиболее распространенный сценарий для разработчиков приложений заключается в том, что вы будете использовать RegisterName для регистрации имен в области имен XAML в текущем корне страницы. RegisterName является частью важного сценария раскадровки, направленной на анимационные объекты. Дополнительные сведения см. в разделе «Обзор раскадровок».
При вызове RegisterName объекта, отличного от объекта, определяющего область имен XAML, имя по-прежнему регистрируется в области имен XAML, в которой находится вызывающий объект, как если бы вы вызвали RegisterName определяющий объект XAML.
Области имен XAML в коде
Вы можете создать и использовать области имен XAML в коде. API и концепции, используемые в создании имен XAML, остаются неизменными даже при программной их реализации, так как процессор XAML для WPF использует эти API и концепции, когда обрабатывает сам XAML. Понятия и API существуют главным образом для того, чтобы иметь возможность находить объекты по имени в дереве объектов, который обычно определяется частично или полностью в XAML.
Для приложений, созданных программным способом, а не из загруженного XAML, объект, определяющий область имен XAML, должен реализовывать INameScopeили быть FrameworkElement или FrameworkContentElement производным классом для поддержки создания области имен XAML на своих экземплярах.
Кроме того, для любого элемента, который не загружается и обрабатывается обработчиком XAML, область имен XAML для объекта не создается или инициализирована по умолчанию. Необходимо явно создать новую область имен XAML для любого объекта, в который вы планируете впоследствии зарегистрировать имена. Чтобы создать область имен XAML, вызовите статический SetNameScope метод. Укажите объект, которому он будет принадлежать, как параметр dependencyObject, а вызов нового конструктора NameScope как параметр value.
Если предоставленный объект в качестве dependencyObject для SetNameScope не является реализацией INameScope, FrameworkElement или FrameworkContentElement, вызов RegisterName на любых дочерних элементах не окажет никакого воздействия. Если вам не удается явно создать новую именованную область XAML, вызовы RegisterName будут вызывать исключение.
Пример использования API области имен XAML в коде см. в разделе "Определение области имен".
Области имен XAML в стилях и шаблонах
Стили и шаблоны в WPF обеспечивают возможность повторного использования и применения содержимого простым способом. Однако стили и шаблоны также могут включать элементы с именами XAML, определенными на уровне шаблона. Один и тот же шаблон может использоваться несколько раз на странице. По этой причине стили и шаблоны определяют собственные области имен XAML, независимо от расположения в дереве объектов, где применяется стиль или шаблон.
Рассмотрим следующий пример:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Page.Resources>
<ControlTemplate x:Key="MyButtonTemplate" TargetType="{x:Type Button}">
<Border BorderBrush="Red" Name="TheBorder" BorderThickness="2">
<ContentPresenter/>
</Border>
</ControlTemplate>
</Page.Resources>
<StackPanel>
<Button Template="{StaticResource MyButtonTemplate}">My first button</Button>
<Button Template="{StaticResource MyButtonTemplate}">My second button</Button>
</StackPanel>
</Page>
Здесь один и тот же шаблон применяется к двум разным кнопкам. Если шаблоны не имели дискретных пространств имен XAML, имя, используемое в шаблоне, TheBorder приведет к столкновению имен в пространстве имен XAML. Каждый экземпляр шаблона имеет собственную область имен XAML, таким образом, каждая область имен XAML каждого экземпляра шаблона будет содержать ровно одно имя.
Стили также определяют собственную область имен XAML, особенно для того, чтобы части Storyboard могли иметь определенные имена. Эти имена позволяют управлять определенным поведением, нацеленным на элементы с этим именем, даже если шаблон был переопределён в рамках настройки элемента управления.
Из-за отдельных областей имен XAML поиск именованных элементов в шаблоне является более сложным, чем поиск не шаблонного именованного элемента на странице. Сначала необходимо определить примененный шаблон, получив Template значение свойства элемента управления, в котором применяется шаблон. Затем вы вызываете версию шаблона FindName, передав элемент управления, в котором был применен шаблон, в качестве второго параметра.
Если вы являетесь автором элемента управления, и вы создаете соглашение, в котором конкретный именованный элемент в примененном шаблоне является целевым для поведения, определенного самим элементом управления, можно использовать GetTemplateChild метод из кода реализации элемента управления. Метод GetTemplateChild защищен, поэтому к нему имеет доступ только автор элемента управления.
Если вы работаете в шаблоне и вам нужно попасть в пространство имен XAML, где применяется шаблон, получите значение TemplatedParent, а затем вызовите FindName там. Примером работы в шаблоне будет создание реализации обработчика событий, в которой событие будет вызываться из элемента в примененном шаблоне.
Области имен XAML и API, связанные с именами
FrameworkElement имеет FindNameи RegisterNameUnregisterName методы. Если объект, вызываемый этими методами, принадлежит области имен XAML, методы вызывают методы соответствующей области имен XAML. В противном случае проверяется родительский элемент, чтобы выяснить, принадлежит ли ему область имен XAML, и этот процесс продолжается рекурсивно, до тех пор, пока не будет найдена область имен XAML (из-за поведения обработчика XAML гарантированно присутствует область имен XAML в корневом элементе). FrameworkContentElement имеет аналогичное поведение, за исключением того, что FrameworkContentElement никогда не будет принадлежать области имен XAML. Методы существуют в FrameworkContentElement, с тем, чтобы вызовы могли быть перенаправлены в родительский FrameworkElement элемент.
SetNameScope используется для сопоставления новой области имён XAML к существующему объекту. Можно вызывать SetNameScope несколько раз, чтобы сбросить или очистить область имен XAML, но это не частое использование. Кроме того, GetNameScope обычно не используется из кода.
Реализации области имен XAML
Следующие классы реализуют INameScope напрямую:
ResourceDictionary не использует имена XAML или области имен; Вместо этого он использует ключи, так как это реализация словаря. Единственная причина, по которой ResourceDictionary реализует INameScope, заключается в том, чтобы он мог вызывать исключения в пользовательском коде, которые помогают уточнить различие между истинной областью имен XAML и способом обработки ключей в ResourceDictionary, а также для того, чтобы гарантировать, что области имен XAML не применяются к ResourceDictionary элементами родителя.
FrameworkTemplate и Style реализуют INameScope с помощью явных определений интерфейса. Явные реализации позволяют этим областям имен XAML вести себя традиционно при доступе через INameScope интерфейс, что является способом обмена данными с помощью внутренних процессов WPF. Но явные определения интерфейса не являются частью обычной области API FrameworkTemplate и Style, так как редко необходимо вызывать методы INameScope на FrameworkTemplate и Style напрямую, и вместо этого следует использовать другие API, такие как GetTemplateChild.
Следующие классы определяют собственную область имен XAML с помощью вспомогательного System.Windows.NameScope класса и подключения к реализации области имен XAML через присоединенное NameScope.NameScope свойство:
См. также
.NET Desktop feedback