Поделиться через


Руководство по синтаксису XAML

Мы объясним правила синтаксиса XAML и терминологию, описывающую ограничения или варианты, доступные для синтаксиса XAML. Этот раздел полезен, если вы не знакомы с использованием языка XAML, хотите обновить терминологию или части синтаксиса, или вам интересно, как работает язык XAML и требуется больше фона и контекста.

XAML — XML

Расширяемый язык разметки приложений (XAML) имеет базовый синтаксис, который строится на XML, и по определению допустимый XAML должен быть допустимым XML. Но XAML также имеет собственные понятия синтаксиса, которые расширяют XML. Определенная сущность XML может быть допустимой в обычном ФОРМАТЕ XML, но этот синтаксис может иметь другое и более полное значение, как XAML. В этом разделе описываются эти понятия синтаксиса XAML.

Словари XAML

Одна из областей, в которой XAML отличается от большинства использования XML, заключается в том, что XAML обычно не применяется с схемой, например XSD-файл. Это связано с тем, что XAML предназначен для расширения, это то, что "X" в акрониме XAML означает. После синтаксического анализа XAML элементы и атрибуты, которые вы ссылаетесь в XAML, должны существовать в некоторых представлениях кода резервного копирования либо в основных типах, определенных среда выполнения Windows, либо в типах, которые расширяются или основаны на среда выполнения Windows. Документация по пакету SDK иногда ссылается на типы, уже встроенные в среда выполнения Windows, и их можно использовать в XAML как словарь XAML для среда выполнения Windows. Microsoft Visual Studio помогает создавать разметку, допустимую в этом словаре XAML. Visual Studio также может включать пользовательские типы для использования XAML, если источник этих типов указан правильно в проекте. Дополнительные сведения о XAML и пользовательских типах см. в разделе "Пространства имен XAML" и сопоставления пространств имен.

Объявление объектов

Программисты часто думают с точки зрения объектов и элементов, тогда как язык разметки концептуально называется элементами и атрибутами. В самом базовом смысле элемент, объявленный в разметке XAML, становится объектом в представлении объекта среды выполнения резервного копирования. Чтобы создать объект времени выполнения для приложения, вы объявляете элемент XAML в разметке XAML. Объект создается при загрузке XAML среда выполнения Windows.

XAML-файл всегда имеет ровно один элемент, который служит его корнем, который объявляет объект, который будет концептуальным корнем некоторых структур программирования, таких как страница, или граф объектов всего определения времени выполнения приложения.

С точки зрения синтаксиса XAML существует три способа объявления объектов в XAML:

  • Непосредственно с помощью синтаксиса элемента объекта: при этом используются открывающие и закрывающие теги для создания экземпляра объекта в качестве элемента XML-формы. Этот синтаксис можно использовать для объявления корневых объектов или создания вложенных объектов, которые задают значения свойств.
  • Косвенное использование синтаксиса атрибута: использует встроенное строковое значение, которое содержит инструкции по созданию объекта. Средство синтаксического анализа XAML использует эту строку для задания значения свойства только что созданному ссылочного значения. Поддержка этого объекта ограничена определенными общими объектами и свойствами.
  • Использование расширения разметки.

Это не означает, что у вас всегда есть любой синтаксис для создания объектов в словаре XAML. Некоторые объекты можно создавать только с помощью синтаксиса элемента объекта. Некоторые объекты можно создать только путем первоначального задания в атрибуте. На самом деле объекты, которые могут быть созданы с помощью элемента объекта или синтаксиса атрибутов, сравнительно редки в словарях XAML. Даже если оба синтаксиса возможны, один из синтаксисов будет более распространенным в стиле. Существуют также методы, которые можно использовать в XAML для ссылки на существующие объекты, а не для создания новых значений. Существующие объекты могут быть определены либо в других областях XAML, либо могут существовать неявно через некоторое поведение платформы и его приложений или моделей программирования.

Объявление объекта с помощью синтаксиса элемента объекта

Чтобы объявить объект с синтаксисом элемента объекта, необходимо написать такие теги: <objectName> </objectName>где objectName — это имя типа для объекта, который требуется создать. Вот использование элемента объекта для объявления объекта Canvas:

<Canvas>
</Canvas>

Если объект не содержит другие объекты, можно объявить элемент объекта с помощью одного самозаверяющего тега вместо пары открытия и закрытия: <Canvas />

Контейнеры

Многие объекты, используемые в качестве элементов пользовательского интерфейса, например Canvas, могут содержать другие объекты. Иногда они называются контейнерами. В следующем примере показан контейнер Canvas , содержащий один элемент, прямоугольник.

<Canvas>
  <Rectangle />
</Canvas>

Объявление объекта с помощью синтаксиса атрибутов

Так как это поведение привязано к параметру свойства, мы поговорим об этом больше в предстоящих разделах.

Текст инициализации

Для некоторых объектов можно объявить новые значения с помощью внутреннего текста, который используется в качестве значений инициализации для построения. В XAML этот метод и синтаксис называются текстом инициализации. Концептуально текст инициализации аналогичен вызову конструктора с параметрами. Текст инициализации полезен для задания начальных значений определенных структур.

Часто используется синтаксис элемента объекта с текстом инициализации, если требуется значение структуры с x:Key, поэтому оно может существовать в ResourceDictionary. Это можно сделать, если вы используете это значение структуры между несколькими целевыми свойствами. Для некоторых структур нельзя использовать синтаксис атрибутов для задания значений структуры: текст инициализации — единственный способ создать полезный и общий ресурс CornerRadius, Thickness, GridLength или Color.

В этом сокращенном примере текст инициализации используется для указания значений толщины, в данном случае указывая значения, которые задают значения слева и справа на 20, а также для верхнего и нижнего — 10. В этом примере показана толщина , созданная в качестве ключа ресурса, а затем ссылка на этот ресурс. Дополнительные сведения о тексте инициализации толщины см. в разделе "Толщина".

<UserControl ...>
  <UserControl.Resources>
    <Thickness x:Key="TwentyTenThickness">20,10</Thickness>
    ....
  </UserControl.Resources>
  ...
  <Grid Margin="{StaticResource TwentyTenThickness}">
  ...
  </Grid>
</UserControl ...>

Обратите внимание , что некоторые структуры не могут быть объявлены как элементы объекта. Текст инициализации не поддерживается, и их нельзя использовать в качестве ресурсов. Чтобы задать свойства этим значениям в XAML, необходимо использовать синтаксис атрибута. Эти типы: Duration, RepeatBehavior, Point, Rect и Size.

Настройка свойств

Свойства объектов, объявленных с помощью синтаксиса элемента объекта. Существует несколько способов задания свойств в XAML:

  • С помощью синтаксиса атрибута.
  • С помощью синтаксиса элемента свойства.
  • Используя синтаксис элементов, в котором содержимое (внутренний текст или дочерние элементы) задает свойство содержимого XAML объекта.
  • С помощью синтаксиса коллекции (который обычно является неявным синтаксисом коллекции).

Как и в объявлении объектов, этот список не означает, что любое свойство может быть задано с каждым из методов. Некоторые свойства поддерживают только один из методов. Некоторые свойства поддерживают несколько форм; Например, есть свойства, которые могут использовать синтаксис элемента свойства или синтаксис атрибута. Что возможно, зависит как от свойства, так и от типа объекта, используемого свойством. В справочнике по API среда выполнения Windows вы увидите использование XAML, которые можно использовать в разделе синтаксиса. Иногда существует альтернативное использование, которое будет работать, но будет более подробным. Подробные сведения об использовании не всегда отображаются, так как мы пытаемся показать вам рекомендации или реальные сценарии использования этого свойства в XAML. Руководство по синтаксису XAML представлено в разделах использования XAML эталонных страниц для свойств, которые можно задать в XAML.

Некоторые свойства объектов не могут быть заданы в XAML любым способом и могут быть заданы только с помощью кода. Обычно это свойства, с которыми лучше работать в коде, а не в XAML.

Свойство, доступное только для чтения, нельзя задать в XAML. Даже в коде тип владения должен поддерживать другой способ настройки, например перегрузку конструктора, вспомогательный метод или поддержку вычисляемого свойства. Вычисляемое свойство зависит от значений других свойств наборов, а также иногда события со встроенной обработкой; эти функции доступны в системе свойств зависимостей. Дополнительные сведения о том, как свойства зависимостей полезны для поддержки вычисляемых свойств, см. в обзоре свойств зависимостей.

Синтаксис коллекции в XAML предоставляет внешний вид, который вы задаете свойство только для чтения, но на самом деле вы не являетесь. См. раздел "Синтаксис коллекции" далее в этом разделе.

Задание свойства с помощью синтаксиса атрибута

Установка значения атрибута является типичным средством, с помощью которого вы задаете значение свойства на языке разметки, например в ФОРМАТЕ XML или HTML. Настройка атрибутов XAML аналогична настройке значений атрибутов в XML. Имя атрибута указывается в любой точке тегов после имени элемента, разделенного по крайней мере одним пробелом. За именем атрибута следует знак равенства. Значение атрибута содержится в паре кавычки. Кавычки могут быть двойными или одними кавычками до тех пор, пока они совпадают и заключены в значение. Само значение атрибута должно быть выражено как строка. Строка часто содержит числовые значения, но в XAML все значения атрибутов являются строковыми значениями, пока средство синтаксического анализа XAML не будет участвовать и выполняет некоторое базовое преобразование значений.

В этом примере используется синтаксис атрибутов для четырех атрибутов, чтобы задать свойства Name, Width, Height и Fill объекта Rectangle.

<Rectangle Name="rectangle1" Width="100" Height="100" Fill="Blue" />

Задание свойства с помощью синтаксиса элемента свойства

Многие свойства объекта можно задать с помощью синтаксиса элемента свойства. Элемент свойства выглядит следующим образом: <свойство> объекта..

Чтобы использовать синтаксис элемента свойства, создайте элементы свойства XAML для свойства, которое требуется задать. В стандартном XML этот элемент просто считается элементом, который имеет точку в его имени. Однако в XAML точка в имени элемента определяет элемент как элемент свойства, при этом свойство должно быть членом объекта в реализации резервной объектной модели. Чтобы использовать синтаксис элемента свойства, необходимо указать элемент объекта для заполнения тегов элемента свойства. Элемент свойства всегда будет содержать некоторое содержимое (один элемент, несколько элементов или внутренний текст); Нет смысла иметь элемент самозаверяющего свойства.

В следующей грамматике свойство — это имя свойства , которое требуется задать, и propertyValueAsObjectElement является одним элементом объекта, который, как ожидается, удовлетворяет требованиям типа значения свойства.

<object>

<Свойство объекта.>

propertyValueAsObjectElement

</Свойство объекта.>

</object>

В следующем примере используется синтаксис элемента свойства для задания заливки прямоугольника с элементом объекта SolidColorBrush. (Внутри SolidColorBrush, Color задан в качестве атрибута.) Результат синтаксического анализа этого XAML идентичен предыдущему примеру XAML, который задает Fill с помощью синтаксиса атрибутов.

<Rectangle
  Name="rectangle1"
  Width="100" 
  Height="100"
> 
  <Rectangle.Fill> 
    <SolidColorBrush Color="Blue"/> 
  </Rectangle.Fill>
</Rectangle>

Словари XAML и объектно-ориентированное программирование

Свойства и события, которые отображаются как элементы XAML типа среда выполнения Windows XAML, часто наследуются от базовых типов. Рассмотрим этот пример: <Button Background="Blue" .../>. Свойство Background не является немедленно объявленным свойством класса Button . Вместо этого фон наследуется от базового класса Control. На самом деле, если посмотреть на справочный раздел кнопки, вы увидите, что списки элементов содержат по крайней мере один унаследованный элемент из каждой цепочки последовательных базовых классов: ButtonBase, Control, FrameworkElement, UIElement, DependencyObject. В списке свойств все свойства чтения и записи и свойства коллекции наследуются в смысле словаря XAML. События (например, различные события UIElement ) тоже наследуются.

Если вы используете ссылку среда выполнения Windows для руководства по XAML, имя элемента, отображаемое в синтаксисе или даже в примере кода, иногда для типа, который первоначально определяет свойство, так как этот справочный раздел разделяется всеми возможными типами, наследующими его от базового класса. Если вы используете IntelliSense Visual Studio для XAML в редакторе XML, IntelliSense и его раскрывающиеся списки выполняют большую работу объединения наследования и предоставления точного списка атрибутов, доступных для настройки после начала работы с элементом объекта для экземпляра класса.

Свойства содержимого XAML

Некоторые типы определяют одно из своих свойств, так что свойство включает синтаксис содержимого XAML. Для свойства содержимого XAML типа можно опустить элемент свойства для этого свойства при указании его в XAML. Кроме того, можно задать для свойства внутреннее текстовое значение, предоставив этот внутренний текст непосредственно в тегах элементов объекта типа. Свойства содержимого XAML поддерживают простой синтаксис разметки для этого свойства и делает XAML более удобочитаемым путем уменьшения вложения.

Если синтаксис содержимого XAML доступен, этот синтаксис будет отображаться в разделах "XAML" синтаксиса для этого свойства в справочной документации по среда выполнения Windows. Например, страница "Дочернее свойство" для Border отображает синтаксис содержимого XAML вместо синтаксиса элемента свойства, чтобы задать значение Border.Child с одним объектом, как показано ниже.

<Border>
  <Button .../>
</Border>

Если свойство, объявленное как свойство содержимого XAML, является типом объекта или типом String, синтаксис содержимого XAML поддерживает в основном внутренний текст в модели XML-документа: строку между открывающим и закрывающим тегами объектов. Например, страница свойств Text для TextBlock показывает синтаксис содержимого XAML, имеющий внутреннее текстовое значение для задания текста, но строка "Текст" никогда не отображается в разметке. Ниже приведен пример использования:

<TextBlock>Hello!</TextBlock>

Если свойство содержимого XAML существует для класса, это указано в справочном разделе для класса в разделе "Атрибуты". Найдите значение ContentPropertyAttribute. Этот атрибут использует именованное поле "Name". Значение "Name" — это имя свойства этого класса, которое является свойством содержимого XAML. Например, на странице ссылки "Граница " вы увидите следующее: ContentProperty("Name=Child").

Одним из важных правил синтаксиса XAML является то, что нельзя перемешиваться со свойством содержимого XAML и другими элементами свойств, заданными в элементе. Свойство содержимого XAML должно быть задано полностью перед любыми элементами свойства или полностью после него. Например, это недопустимый КОД XAML:

<StackPanel>
  <Button>This example</Button>
  <StackPanel.Resources>
    <SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
  </StackPanel.Resources>
  <Button>... is illegal XAML</Button>
</StackPanel>

Синтаксис коллекции

Все синтаксисы, показанные до сих пор, задают свойства для отдельных объектов. Но во многих сценариях пользовательского интерфейса требуется, чтобы у заданного родительского элемента было несколько дочерних элементов. Например, для входной формы пользовательский интерфейс требует нескольких элементов текстового поля, некоторых меток и, возможно, кнопки "Отправить". Тем не менее, если вы использовали объектную модель программирования для доступа к этим нескольким элементам, они обычно будут элементами в одном свойстве коллекции, а не каждый элемент, являющийся значением различных свойств. XAML поддерживает несколько дочерних элементов, а также поддерживает типичную модель резервной коллекции, обрабатывая свойства, использующие тип коллекции как неявный, и выполняя специальную обработку для всех дочерних элементов типа коллекции.

Многие свойства коллекции также определяются как свойство содержимого XAML для класса. Сочетание неявной обработки коллекции и синтаксиса содержимого XAML часто отображается в типах, используемых для создания элементов управления, таких как панели, представления или элементы управления. Например, в следующем примере показан самый простой XAML для создания двух одноранговых элементов пользовательского интерфейса в StackPanel.

<StackPanel>
  <TextBlock>Hello</TextBlock>
  <TextBlock>World</TextBlock>
</StackPanel>

Механизм синтаксиса коллекции XAML

Сначала может появиться, что XAML включает "набор" свойства коллекции только для чтения. В действительности xaml позволяет добавлять элементы в существующую коллекцию. Язык XAML и процессоры XAML, реализующие поддержку XAML, зависят от соглашения о резервном копировании типов коллекций для включения этого синтаксиса. Обычно существует резервное свойство, например индексатор или свойство Items , которое ссылается на определенные элементы коллекции. Как правило, это свойство не является явным в синтаксисе XAML. Для коллекций базовый механизм синтаксического анализа XAML не является свойством, а методом: в частности, метод Add в большинстве случаев. Когда обработчик XAML встречает один или несколько элементов объекта в синтаксисе коллекции XAML, каждый такой объект сначала создается из элемента, каждый новый объект добавляется в содержащую коллекцию путем вызова метода Add коллекции.

Когда средство синтаксического анализа XAML добавляет элементы в коллекцию, это логика метода Add , который определяет, является ли заданный элемент XAML допустимым дочерним элементом объекта коллекции. Многие типы коллекций строго типизированы резервной реализацией, что означает, что входной параметр Add ожидает, что все, что передается, должно быть типом, соответствующим типу параметра Add.

Для свойств коллекции будьте осторожны при попытке явно указать коллекцию в качестве элемента объекта. Средство синтаксического анализа XAML создает новый объект при обнаружении элемента объекта. Если свойство коллекции, которое вы пытаетесь использовать, доступно только для чтения, это может вызвать исключение синтаксического анализа XAML. Просто используйте синтаксис неявной коллекции, и вы не увидите это исключение.

Использование синтаксиса атрибута или элемента свойства

Все свойства, поддерживающие настройку в XAML, будут поддерживать синтаксис атрибута или элемента свойства для прямого значения, но потенциально не будет поддерживать синтаксис взаимозаменяемо. Некоторые свойства поддерживают любой синтаксис, а некоторые свойства поддерживают дополнительные параметры синтаксиса, такие как свойство содержимого XAML. Тип синтаксиса XAML, поддерживаемый свойством, зависит от типа объекта, который свойство использует в качестве типа свойства. Если тип свойства является примитивным типом, например двойным (float или десятичным), целым числом, логическим или строковым, свойство всегда поддерживает синтаксис атрибутов.

Можно также использовать синтаксис атрибута для задания свойства, если тип объекта, используемый для задания этого свойства, можно создать путем обработки строки. Для примитивов это всегда так, преобразование типов встроено в средство синтаксического анализа. Однако некоторые другие типы объектов также можно создать с помощью строки, указанной в качестве значения атрибута, а не элемента объекта в элементе свойства. Для этого необходимо преобразовать базовый тип, поддерживаемый этим свойством или поддерживаемый обычно для всех значений, использующих этот тип свойства. Строковое значение атрибута используется для задания свойств, важных для инициализации нового значения объекта. Возможно, преобразователь определенных типов также может создавать различные подклассы общего типа свойств в зависимости от того, как она однозначно обрабатывает информацию в строке. Типы объектов, поддерживающие это поведение, будут иметь специальную грамматику, указанную в разделе синтаксиса справочной документации. Например, синтаксис XAML для Кисти показывает, как синтаксис атрибута можно использовать для создания нового значения SolidColorBrush для любого свойства кисти типа (и есть много свойств кисти в среда выполнения Windows XAML).

Логика и правила синтаксического анализа XAML

Иногда это информативно читать XAML таким же образом, как средство синтаксического анализа XAML: как набор строковых маркеров, встречающихся в линейном порядке. Средство синтаксического анализа XAML должно интерпретировать эти маркеры в соответствии с набором правил, которые являются частью определения работы XAML.

Установка значения атрибута является типичным средством, с помощью которого вы задаете значение свойства на языке разметки, например в ФОРМАТЕ XML или HTML. В следующем синтаксисе objectName — это объект, который требуется создать, propertyName — это имя свойства, которое необходимо задать для этого объекта, а свойствоValue — это значение, которое нужно задать.

<objectName propertyName="propertyValue" .../>

-or-

<objectName propertyName="propertyValue">

...<!--element children -->

</objectName>

Любой синтаксис позволяет объявить объект и задать свойство для этого объекта. Хотя первый пример является одним элементом в разметке, на самом деле существуют дискретные шаги в отношении того, как обработчик XAML анализирует эту разметку.

Во-первых, наличие элемента объекта указывает, что необходимо создать экземпляр нового объекта objectName . Только после того, как такой экземпляр существует, свойство свойства экземпляра можно задать в нем.

Другим правилом XAML является то, что атрибуты элемента должны быть заданы в любом порядке. Например, нет разницы между <Rectangle Height="50" Width="100" /> и <Rectangle Width="100" Height="50" />. Какой порядок используется, является вопросом стиля.

Обратите внимание , что конструкторы XAML часто повышают порядок соглашений, если используются поверхности конструктора, отличные от редактора XML, но вы можете свободно редактировать код XAML позже, чтобы изменить порядок атрибутов или ввести новые.

Вложенные свойства

XAML расширяет XML путем добавления синтаксического элемента, известного как присоединенное свойство. Как и синтаксис элемента свойства, синтаксис присоединенного свойства содержит точку, а точка имеет особое значение для синтаксического анализа XAML. В частности, точка отделяет поставщика присоединенного свойства и имя свойства.

В XAML можно задать присоединенные свойства с помощью синтаксиса AttachedPropertyProvider.PropertyName Вот пример того, как можно задать присоединенное свойство Canvas.Left в XAML:

<Canvas>
  <Button Canvas.Left="50">Hello</Button>
</Canvas>

Присоединенное свойство можно задать для элементов, которые не имеют свойства этого имени в резервном типе, и таким образом они работают несколько как глобальное свойство или атрибут, определенный другим пространством имен XML, таким как атрибут xml:space .

В среда выполнения Windows XAML вы увидите присоединенные свойства, поддерживающие следующие сценарии:

  • Дочерние элементы могут информировать родительские панели контейнеров о том, как они должны вести себя в макете: Canvas, Grid, VariableSizedWrapGrid.
  • Использование элементов управления может повлиять на поведение важной части элемента управления, которая поступает из шаблона элемента управления: ScrollViewer, VirtualizingStackPanel.
  • Использование службы, доступной в связанном классе, где служба и класс, использующие его, не имеют общего наследования: Typeography, VisualStateManager, AutomationProperties, ToolTipService.
  • Анимация, предназначенная для раскадровки.

Дополнительные сведения см. в разделе "Общие сведения о присоединенных свойствах".

Литеральные значения "{"

Так как символ открывающей фигурной скобки { является открытием последовательности расширения разметки, используется escape-последовательность, чтобы указать литеральное строковое значение, начинающееся с "{". Escape-последовательность — "{}". Например, чтобы указать строковое значение, являющееся одним открывающим скобкой, укажите значение атрибута как "{}{". Можно также использовать альтернативные кавычки (например, "внутри значения атрибута, разделенного "") для предоставления значения "{" в виде строки.

Примечание "\}" также работает, если он находится внутри кавычек атрибута.  

Значения перечисления

Многие свойства в API среда выполнения Windows используют перечисления в качестве значений. Если элемент является свойством чтения и записи, можно задать такое свойство, предоставив значение атрибута. Вы определяете, какое значение перечисления следует использовать в качестве значения свойства с помощью некавалифицированного имени константы. Например, вот как задать UIElement.Видимость в XAML: <Button Visibility="Visible"/> Здесь строка "Видимая" сопоставляется непосредственно с именованной константой перечисления видимости , видимой.

  • Не используйте квалифицированную форму, она не будет работать. Например, это недопустимый КОД XAML: <Button Visibility="Visibility.Visible"/>
  • Не используйте значение константы. Другими словами, не полагаться на целочисленное значение перечисления, которое существует явно или неявно в зависимости от того, как было определено перечисление. Хотя это может работать, это плохая практика либо в XAML, либо в коде, так как вы полагаетесь на то, что может быть временным описанием реализации. Например, не сделайте следующее: <Button Visibility="1"/>

Примечание. В справочных разделах для API, использующих XAML и использующие перечисления, щелкните ссылку на тип перечисления в разделе "Значение свойства" синтаксиса. Эти ссылки на страницу перечисления, где можно обнаружить именованные константы для этого перечисления.

Перечисления могут быть пометками, что означает, что они относятся к FlagsAttribute. Если необходимо указать сочетание значений для пометки перечисления в качестве значения атрибута XAML, используйте имя каждой константы перечисления с запятой (,), между каждым именем и не пересекающимися пробелами. Атрибуты с флагами не являются общими в словаре XAML среда выполнения Windows, но ManipulationModes является примером, где поддерживается задание значения перечисления по флагам в XAML.

Интерфейсы в XAML

В редких случаях вы увидите синтаксис XAML, в котором тип свойства является интерфейсом. В системе типов XAML тип, реализующий этот интерфейс, допускается в качестве значения при синтаксическом анализе. Для использования в качестве значения должен быть создан экземпляр такого типа. Вы увидите интерфейс, используемый в качестве типа в синтаксисе XAML для свойств Command и CommandParameter в ButtonBase. Эти свойства поддерживают шаблоны проектирования Model-View-ViewModel (MVVM), в которых интерфейс ICommand является контрактом для взаимодействия представлений и моделей.

Соглашения о заполнителях XAML в среда выполнения Windows справочнике

Если вы изучили любой из разделов синтаксиса справочных разделов для среда выполнения Windows API, которые могут использовать XAML, вы, вероятно, видели, что синтаксис содержит довольно несколько заполнителей. Синтаксис XAML отличается от синтаксиса компонентов C#, Microsoft Visual Basic или Visual C++ (C++/CX), так как синтаксис XAML является синтаксисом использования. Это указывает на ваше конечное использование в собственных XAML-файлах, но без чрезмерного описания значений, которые можно использовать. Обычно использование описывает тип грамматики, которая смешивает литералы и заполнители и определяет некоторые заполнители в разделе "Значения XAML".

При отображении имен типов или имен элементов в синтаксисе XAML для свойства отображается имя типа, которое изначально определяет свойство. Но среда выполнения Windows XAML поддерживает модель наследования классов для классов на основе DependencyObject. Поэтому можно часто использовать атрибут в классе, который не является буквально определяющим классом, а производным от класса, который сначала определил свойство или атрибут. Например, можно задать Видимость в качестве атрибута для любого производного класса UIElement с помощью глубокого наследования. Например: <Button Visibility="Visible" />. Поэтому не берите имя элемента, отображаемое в синтаксисе использования XAML, слишком буквально; Синтаксис может быть жизнеспособным для элементов, представляющих этот класс, а также элементы, представляющие производный класс. В случаях, когда тип, отображаемый как определяющий элемент, находится в реальном использовании, это редкое или невозможное имя типа намеренно в нижнем регистре синтаксиса. Например, синтаксис, который вы видите для UIElement.Видимость :

<uiElement Visibility="Visible"/>
-or-
<uiElement Visibility="Collapsed"/>

Многие разделы синтаксиса XAML содержат заполнители в разделе "Использование", который затем определяется в разделе "Значения XAML", который находится непосредственно в разделе синтаксиса.

Разделы использования XAML также используют различные обобщенные заполнители. Эти заполнители не переопределяются каждый раз в значениях XAML, так как вы угадываете или в конечном итоге узнаете, что они представляют. Мы считаем, что большинство читателей устали видеть их в значениях XAML снова и снова, поэтому мы оставили их из определений. Для справки вот список некоторых из этих заполнителей и то, что они означают в общем смысле:

  • объект: теоретически любое значение объекта, но часто практически ограничено определенными типами объектов, таких как выбор строки или объекта, и вы должны проверить примечания на справочной странице для получения дополнительных сведений.
  • свойство объекта: свойство объекта в сочетании используется в случаях, когда показанный синтаксис является синтаксисом для типа, который можно использовать в качестве значения атрибута для многих свойств. Например, использование атрибутов Xaml, показанное для Кисти, включает: <свойство объекта="predefinedColorName"/>
  • eventhandler: это значение атрибута для каждого синтаксиса XAML, показанного для атрибута события. Здесь указано имя функции для функции обработчика событий. Эта функция должна быть определена в коде для страницы XAML. На уровне программирования эта функция должна соответствовать подписи делегата обрабатываемого события или код приложения не компилируется. Но это действительно вопрос программирования, а не рассмотрение XAML, поэтому мы не пытаемся намекать ни на что о типе делегата в синтаксисе XAML. Если вы хотите знать, какой делегат необходимо реализовать для события, то есть в разделе сведений о событии справочной статьи для события в строке таблицы, которая помечена делегатом.
  • enumMemberName: показан в синтаксисе атрибутов для всех перечислений. Существует аналогичный заполнитель для свойств, использующих значение перечисления, но обычно префиксирует заполнитель с указанием имени перечисления. Например, синтаксис, показанный для FrameworkElement.FlowDirection, — <frameworkElementFlowDirection="flowDirectionMemberName"/>. Если вы находитесь на одной из этих страниц ссылок на свойства, щелкните ссылку на тип перечисления, который отображается в разделе "Значение свойства", рядом с текстом Type:. Для значения атрибута свойства, использующего это перечисление, можно использовать любую строку, указанную в столбце "Член" списка членов.
  • double, int, string, bool: это примитивные типы, известные языку XAML. При программировании с помощью C# или Visual Basic эти типы проецируются в эквивалентные типы Microsoft .NET, такие как Double, Int32, String и Boolean, и вы можете использовать любые члены этих типов .NET при работе с определенными XAML-значениями в коде .NET. При программировании с помощью C++/CX вы будете использовать примитивные типы C++, но можно также рассмотреть эти эквиваленты типам, определенным пространством имен платформы, например Platform::String. Иногда существуют дополнительные ограничения значений для определенных свойств. Но обычно эти значения отображаются в разделе "Значение свойства " или разделе "Примечания", а не в разделе XAML, так как любые такие ограничения применяются как к использованию кода, так и к использованию XAML.

Советы и рекомендации, заметки о стиле

  • Расширения разметки в целом описаны в основном обзоре XAML. Но расширение разметки, которое наиболее влияет на рекомендации, приведенные в этом разделе, — расширение разметки StaticResource (и связанное с ThemeResource). Функция расширения разметки StaticResource заключается в том, чтобы включить факторы XAML в многократно используемые ресурсы, поступающие из resourceDictionary XAML. Вы почти всегда определяете шаблоны элементов управления и связанные стили в ResourceDictionary. Вы часто определяете небольшие части определения шаблона элемента управления или стиль для конкретного приложения в ResourceDictionary, например SolidColorBrush для цвета, который приложение использует несколько раз для разных частей пользовательского интерфейса. Используя StaticResource, любое свойство, которое в противном случае требует использования элемента свойства для задания, теперь можно задать в синтаксисе атрибутов. Но преимущества факторинга XAML для повторного использования выходят за рамки просто упрощения синтаксиса на уровне страницы. Дополнительные сведения см. в справочниках по ресурсам ResourceDictionary и XAML.
  • В примерах XAML вы увидите несколько различных соглашений о применении пробелов и веб-каналов. В частности, существуют различные соглашения о том, как разбить элементы объекта с множеством различных наборов атрибутов. Это просто вопрос стиля. Редактор XML Visual Studio применяет некоторые правила стиля по умолчанию при редактировании XAML, но их можно изменить в параметрах. Существует небольшое количество случаев, когда пробелы в XAML-файле считаются значительными; Дополнительные сведения см. в разделе XAML и пробелы.