Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Мы объясним правила синтаксиса 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. Объект создается, когда среда выполнения Windows загружает ваш XAML.
XAML-файл всегда имеет ровно один элемент, который служит его корнем, который объявляет объект, который будет концептуальным корнем некоторых структур программирования, таких как страница, или граф объектов всего определения времени выполнения приложения.
С точки зрения синтаксиса XAML существует три способа объявления объектов в XAML:
- Напрямую с помощью синтаксиса элемента объекта: При этом используются открывающие и закрывающие теги для создания экземпляра объекта в виде элемента XML-формы. Этот синтаксис можно использовать для объявления корневых объектов или создания вложенных объектов, которые задают значения свойств.
- Косвенно, используя синтаксис атрибута: В этом случае используется встроенное строковое значение, которое содержит инструкции по созданию объекта. Парсер XAML использует эту строку для задания значения свойства новому ссылочному значению. Поддержка этого объекта ограничена определенными общими объектами и свойствами.
- Использование расширения разметки.
Это не означает, что у вас всегда есть любой синтаксис для создания объектов в словаре XAML. Некоторые объекты можно создавать только с помощью синтаксиса элемента объекта. Некоторые объекты можно создать только путем первоначального задания в атрибуте. На самом деле объекты, которые могут быть созданы с помощью элемента объекта или синтаксиса атрибутов, сравнительно редки в словарях XAML. Даже если возможны оба синтаксиса, один будет более распространен с точки зрения стиля. Существуют также методы, которые можно использовать в XAML для ссылки на существующие объекты, а не для создания новых значений. Существующие объекты могут быть определены либо в других областях XAML, либо могут существовать неявно через некоторое поведение платформы и его приложений или моделей программирования.
Объявление объекта с помощью синтаксиса элемента объекта
Чтобы объявить объект с синтаксисом элемента объекта, необходимо написать такие теги: <objectName> </objectName>где objectName — это имя типа для объекта, который требуется создать. Вот использование элемента объекта для объявления объекта Canvas :
<Canvas>
</Canvas>
Если объект не содержит другие объекты, можно объявить элемент объекта с помощью одного самозаверяющего тега вместо пары открытия и закрытия: <Canvas />
Containers
Многие объекты, используемые в качестве элементов пользовательского интерфейса, например 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 является одним элементом объекта, который, как ожидается, удовлетворяет требованиям типа значения свойства.
<
объект>
<
объект.свойство>
propertyValueAsObjectElement
</
объект.свойство>
</
объект>
В следующем примере используется синтаксис элемента свойства для задания заливкипрямоугольника с помощью объектного элемента SolidColorBrush. (В SolidColorBrushцвет задается в качестве атрибута.) Результат синтаксического анализа этого XAML идентичен предыдущему примеру XAML, который задает Fill с помощью синтаксиса атрибутов.
<Rectangle
Name="rectangle1"
Width="100"
Height="100">
<Rectangle.Fill>
<SolidColorBrush Color="Blue"/>
</Rectangle.Fill>
</Rectangle>
Словари XAML и объектно-ориентированное программирование
Свойства и события, которые отображаются как элементы XAML типа XAML среды выполнения Windows, часто наследуются от базовых типов. Рассмотрим этот пример: <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. Например, страница свойства Child для Border отображает синтаксис содержимого XAML вместо синтаксиса элемента свойства для задания значения свойству Border.Child, представляющего один объект Border, как показано ниже.
<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 Runtime XAML есть много свойств Кисти).
Логика и правила синтаксического анализа XAML
Иногда полезно читать XAML так же, как это делает анализатор XAML: как набор строковых маркеров, встречающихся в линейном порядке. Средство синтаксического анализа XAML должно интерпретировать эти маркеры в соответствии с набором правил, которые являются частью определения работы XAML.
Установка значения атрибута является типичным средством, с помощью которого вы задаете значение свойства на языке разметки, например в ФОРМАТЕ XML или HTML. В следующем синтаксисе objectName — это объект, который требуется создать, propertyName — это имя свойства, которое необходимо задать для этого объекта, а свойствоValue — это значение, которое нужно задать.
<objectName propertyName="propertyValue" .../>
-or-
<objectName propertyName="propertyValue">
...<!--element children -->
</objectName>
Любой синтаксис позволяет объявить объект и задать свойство для этого объекта. Хотя первый пример является одним элементом в разметке, на самом деле существуют дискретные шаги в отношении того, как обработчик XAML анализирует эту разметку.
Во-первых, наличие элемента объекта указывает, что необходимо создать экземпляр нового объекта objectName . Только после того, как такой экземпляр существует, можно установить свойство propertyName на нем.
Другим правилом 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.
В XAML среды выполнения Windows вы увидите присоединенные свойства, поддерживающие следующие сценарии:
- Дочерние элементы могут задавать инструкции родительским контейнерным панелям о том, как они должны вести себя в макете: Canvas, Grid, VariableSizedWrapGrid.
- Использование элементов управления может повлиять на поведение важной части элемента управления, которая поступает из шаблона элемента управления: ScrollViewer, VirtualizingStackPanel.
- Использование службы, доступной в связанном классе, где служба и класс, использующие его, не имеют общего наследования: Typeography, VisualStateManager, AutomationProperties, ToolTipService.
- Анимация, предназначенная для Storyboard.
Дополнительные сведения см. в разделе "Общие сведения о присоединенных свойствах".
Литеральные значения "{"
Так как символ открывающей фигурной скобки { открывает последовательность расширения разметки, используется экранирующая последовательность, чтобы указать литеральное строковое значение, начинающееся с "{". Escape-последовательность — "{}". Например, чтобы указать строковое значение, являющееся одной открывающей фигурной скобкой, укажите значение атрибута как "{}{". Можно также использовать альтернативные кавычки (например, ' внутри значения атрибута, ограниченного ""), чтобы предоставить значение "{" в виде строки.
Замечание
"\}" также работает, если находится внутри атрибута, заключенного в кавычки.
Значения перечисления
Многие свойства в API среды выполнения Windows используют перечисления в качестве значений. Если элемент является свойством чтения и записи, можно задать такое свойство, предоставив значение атрибута. Вы определяете, какое значение перечисления следует использовать в качестве значения свойства с помощью некавалифицированного имени константы. Например, вот как задать UIElement.Видимость в XAML: <Button Visibility="Visible"/> Здесь строка "Visible" непосредственно сопоставляется с именованной константой перечисления 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. Эти свойства поддерживают шаблоны проектирования Модель-View-ViewModel (MVVM), в которых интерфейс ICommand является контрактом, определяющим, как взаимодействуют представления и модели.
Соглашения о заполнителях XAML в справочнике по среде выполнения Windows
Если вы изучили какую-либо часть синтаксиса справочных тем для API среды выполнения Windows, которые могут использовать XAML, вы, вероятно, видели, что синтаксис содержит довольно много заполнителей. Синтаксис XAML отличается от синтаксиса компонентов C#, Microsoft Visual Basic или Visual C++ (C++/CX), так как синтаксис XAML является синтаксисом использования. Это указывает на ваше конечное использование в собственных XAML-файлах, но без чрезмерного описания значений, которые можно использовать. Обычно использование описывает тип грамматики, которая смешивает литералы и заполнители, а некоторые заполнители определены в разделе Значения XAML.
При отображении имен типов или имен элементов в синтаксисе XAML для свойства отображается имя типа, которое изначально определяет свойство. Но XAML среды выполнения Windows поддерживает модель наследования классов для классов на основе 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, — <frameworkElement FlowDirection="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 на многократно используемые ресурсы, которые поступают из XAML ResourceDictionary. Вы почти всегда определяете шаблоны элементов управления и связанные стили в ResourceDictionary. Вы часто определяете небольшие части определения шаблона элемента управления или стиль для конкретного приложения в ResourceDictionary , например SolidColorBrush для цвета, который приложение использует несколько раз для разных частей пользовательского интерфейса. Используя StaticResource, любое свойство, которое в противном случае требует использования элемента свойства для задания, теперь можно задать в синтаксисе атрибутов. Но преимущества факторинга XAML для повторного использования выходят за рамки просто упрощения синтаксиса на уровне страницы. Дополнительные сведения см. в справочниках по ресурсам ResourceDictionary и XAML.
- В примерах XAML вы увидите несколько различных соглашений по применению пробелов и переводов строк. В частности, существуют различные соглашения о том, как разбить элементы объекта с множеством различных наборов атрибутов. Это просто вопрос стиля. Редактор XML Visual Studio применяет некоторые правила стиля по умолчанию при редактировании XAML, но их можно изменить в параметрах. Существует небольшое количество случаев, когда пробелы в XAML-файле считаются значительными; Дополнительные сведения см. в разделе XAML и пробелы.
Связанные темы
Windows developer