Руководство по синтаксису XAMLXAML syntax guide

Здесь разъясняются правила синтаксиса языка XAML и терминология, описывающая доступные для этого синтаксиса ограничения и варианты.We explain XAML syntax rules and the terminology that describes the restrictions or choices available for XAML syntax. Этот раздел будет полезен для тех, кто только знакомится с языком XAML, тех, кто хочет освежить в памяти терминологию или отдельные аспекты синтаксиса, а также для тех, кто интересуется принципами работы XAML и нуждается в дополнительной общей информации и контексте.You'll find this topic useful if you are new to using the XAML language, you want a refresher on the terminology or parts of syntax, or you are curious about how the XAML language works and want more background and context.

Язык XAML — часть языка XMLXAML is XML

Базовый синтаксис языка XAML основывается на XML, поэтому допустимая разметка XAML по определению должна быть допустимой разметкой XML.Extensible Application Markup Language (XAML) has a basic syntax that builds on XML, and by definition valid XAML must be valid XML. Но в XAML имеются и собственные синтаксические концепции, расширяющие XML.But XAML also has its own syntax concepts that extend XML. Определенный объект XML работает и в обычном XML, но в языке XAML его синтаксис будет иметь другое, более полное значение.A given XML entity might be valid in plain XML, but that syntax might have a different and more complete meaning as XAML. В настоящем разделе разъясняются указанные концепции синтаксиса XAML.This topic explains these XAML syntax concepts.

Словари XAMLXAML vocabularies

В отличие от большинства вариантов использования XML, в языке XAML обычно не применяется схема, например XSD-файл.One area where XAML differs from most XML usages is that XAML is not typically enforced with a schema, such as an XSD file. Дело в том, что язык XAML предполагает возможность расширения — именно это означает буква "X" в аббревиатуре XAML.That's because XAML is intended to be extensible, that's what the "X" in the acronym XAML means. После завершения синтаксического анализа XAML элементы и атрибуты, на которые вы ссылаетесь в XAML, должны существовать в каком-либо представлении базового кода: либо в основных типах, определенных средой выполнения Windows, либо в типах, которые расширяют среду выполнения Windows или опираются не на нее.Once XAML is parsed, the elements and attributes you reference in XAML are expected to exist in some backing code representation, either in the core types defined by the Windows Runtime, or in types that extend or are based off the Windows Runtime. Иногда документация SDK ссылается на типы, которые уже встроены в среду выполнения Windows и могут использоваться в XAML как словарь XAML для среды выполнения Windows.The SDK documentation sometimes refers to the types that are already built-in to the Windows Runtime and can be used in XAML as being the XAML vocabulary for the Windows Runtime. С помощью Microsoft Visual Studio можно создавать разметку, которая будет действительна в таком словаре XAML.Microsoft Visual Studio helps you to produce markup that's valid within this XAML vocabulary. В Visual Studio вы можете также включить свои настраиваемые типы для использования в XAML, при условии, что в проекте указана правильная ссылка на исходный код этих типов.Visual Studio can also include your custom types for XAML usage so long as the source of those types is referenced correctly in the project. Подробнее о языке XAML и настраиваемых типах см. в разделе Пространства имен XAML и их сопоставление.For more info about XAML and custom types, see XAML namespaces and namespace mapping.

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

Программисты часто думают в терминах объектов и участников, тогда как основными концепциями языка разметки являются элементы и атрибуты.Programmers often think in terms of objects and members, whereas a markup language is conceptualized as elements and attributes. В общем смысле элемент, декларируемый в разметке языка XAML, становится объектом в представлении объектов базовой среды выполнения.In the most basic sense, an element that you declare in XAML markup becomes an object in a backing runtime object representation. Для создания объекта среды выполнения для приложения в разметке XAML декларируется элемент XAML.To create a run-time object for your app, you declare a XAML element in the XAML markup. Такой объект создается при загрузке XAML средой выполнения Windows.The object is created when the Windows Runtime loads your XAML.

XAML-файл всегда имеет строго один элемент, служащий в качестве корневого и объявляющий объект, который будет концептуальной основой для определенной структуры программирования, например страницы или графа объекта полного определения приложения для среды выполнения.A XAML file always has exactly one element serving as its root, which declares an object that will be the conceptual root of some programming structure such as a page, or the object graph of the entire run-time definition of an application.

В синтаксисе XAML имеются три способа объявить объекты в XAML.In terms of XAML syntax, there are three ways to declare objects in XAML:

  • Непосредственно, используя синтаксис объектного элемента: используются открывающий и закрывающий теги для создания экземпляра объекта в виде элемента XML-формы.Directly, using object element syntax: This uses opening and closing tags to instantiate an object as an XML-form element. Вы можете применять этот синтаксис для объявления корневых объектов или создания вложенных объектов, задающих значения свойств.You can use this syntax to declare root objects or to create nested objects that set property values.
  • Опосредованно, используя синтаксис атрибута: используется значение встроенной строки, содержащей инструкции по созданию объекта.Indirectly, using attribute syntax: This uses an inline string value that has instructions for how to create an object. Средство синтаксического анализа XAML использует данную строку для задания значения свойства создаваемому опорному значению.The XAML parser uses this string to set the value of a property to a newly created reference value. Поддержка его ограничена определенными общими объектами и свойствами.Support for it is limited to certain common objects and properties.
  • Использование расширения разметки.Using a markup extension.

Это не означает, что у вас всегда есть выбор синтаксиса для создания объекта в словаре XAML.This does not mean that you always have the choice of any syntax for object creation in a XAML vocabulary. Некоторые объекты можно создать только с использованием синтаксиса объектного элемента.Some objects can be created only by using object element syntax. Некоторые объекты могут создаваться только путем изначальной установки в атрибуте.Some objects can be created only by being initially set in an attribute. В действительности объектов, которые можно создать как с помощью синтаксиса объектного элемента, так и с помощью синтаксиса атрибута, сравнительно немного в словарях XAML.In fact, objects that can be created with either object element or attribute syntax are comparatively rare in XAML vocabularies. Даже при возможности обоих синтаксических форм один из синтаксисов будет более употребительным с точки зрения стиля.Even if both syntax forms are possible, one of the syntaxes will be more common as a matter of style. Кроме того, для XAML имеются методики привязки существующих объектов вместо создания новых значений.There are also techniques you can use in XAML to reference existing objects rather than creating new values. Существующие объекты могут быть определены в других областях XAML или существовать неявно, за счет поведения платформы и ее приложения либо моделей программирования.The existing objects might be defined either in other areas of XAML, or might exist implicitly through some behavior of the platform and its application or programming models.

Объявление объекта с помощью синтаксиса объектного элементаDeclaring an object by using object element syntax

Для объявления объекта с помощью синтаксиса объектного элемента следует написать теги вида <objectName> </objectName>, где objectName — имя типа объекта, экземпляр которого следует создать.To declare an object with object element syntax, you write tags like this: <objectName> </objectName>, where objectName is the type name for the object you want to instantiate. Ниже представлено использование объектного элемента для объявления объекта Canvas:Here's object element usage to declare a Canvas object:

<Canvas>
</Canvas>

Если объект не содержит других объектов, можно объявить объектный элемент, используя один самокрывающий тег вместо открывающей или закрывающей пары: <Canvas />If the object does not contain other objects, you can declare the object element by using one self-closing tag instead of an opening/closing pair: <Canvas />

КонтейнерыContainers

Многие объекты, используемые как элементы пользовательского интерфейса, например Canvas, могут содержать другие объекты.Many objects used as UI elements, such as Canvas, can contain other objects. Такие объекты часто именуются контейнерами.These are sometimes referred to as containers. В примере ниже показан контейнер Canvas, содержащий один элемент — Rectangle.The following example shows a Canvas container that contains one element, a Rectangle.

<Canvas>
  <Rectangle />
</Canvas>

Объявление объекта с помощью синтаксиса атрибутаDeclaring an object by using attribute syntax

Поскольку указанная реакция на событие привязана к параметрам свойств, рассмотрим ее подробнее в следующих разделах.Because this behavior is tied to property setting, we'll talk about this more in upcoming sections.

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

Для некоторых объектов новые значения можно объявлять при помощи внутреннего текста, используемого в качестве значений инициализации при выполнении построения.For some objects you can declare new values using inner text that's used as initialization values for construction. В языке XAML такие методика и синтаксис именуются текстом инициализации.In XAML, this technique and syntax is called initialization text. Принципиально текст инициализации похож на вызов конструктора, обладающего параметрами.Conceptually, initialization text is similar to calling a constructor that has parameters. Текст инициализации полезен при установке начальных значений определенных структур.Initialization text is useful for setting initial values of certain structures.

Синтаксис объектного элемента с текстом инициализации зачастую используется, когда требуется значение структуры с x:Key в ResourceDictionary.You often use an object element syntax with initialization text if you want a structure value with an x:Key, so it can exist in a ResourceDictionary. Он может потребоваться, если вы намереваетесь сделать значение этой структуры общим для нескольких целевых свойств.You might do this if you share that structure value among multiple target properties. В случае некоторых структур использование синтаксиса атрибута для установки значений структуры невозможно: текст инициализации является единственным вариантом создания полезных общих ресурсов CornerRadius, Thickness, GridLength или ColorFor some structures, you can't use attribute syntax to set the structure's values: initialization text is the only way to produce a useful and shareable CornerRadius, Thickness, GridLength or Color resource.

В это сокращенном примере использован текст инициализации, чтобы указать значения для Thickness, это значения, которые в данном случае установят для Left и Right значение 20, а для Top и Bottom — значение 10.This abbreviated example uses initialization text to specify values for a Thickness, in this case specifying values that set both Left and Right to 20, and both Top and Bottom to 10. В примере показан элемент Thickness, созданный как ресурс с ключом, а затем ссылка на этот ресурс.This example shows the Thickness created as a keyed resource, and then the reference to that resource. Подробнее о тексте инициализации Thickness см. в разделе Thickness.For more info on Thickness initialization text, see Thickness.

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

Примечание    . Некоторые структуры не могут объявляться как элементы объекта.Note  Some structures can't be declared as object elements. Текст инициализации не поддерживается, и их нельзя использовать в качестве ресурсов.Initialization text isn't supported and they can't be used as resources. Чтобы задать такие значения для свойств в языке XAML, следует использовать синтаксис атрибута.You must use an attribute syntax in order to set properties to these values in XAML. Это такие типы: Duration, RepeatBehavior, Point, Rect и Size.These types are: Duration, RepeatBehavior, Point, Rect and Size.

установка свойств.Setting properties

Для объявленных объектов можно задавать свойства, используя синтаксис объектных элементов.You can set properties on objects that you declared by using object element syntax. Для задания свойств в XAML есть несколько способов:There are multiple ways to set properties in XAML:

  • С использованием синтаксиса атрибута.By using attribute syntax.
  • С использованием синтаксиса элементов свойств.By using property element syntax.
  • С использованием синтаксиса элемента, когда содержимое (внутренний текст или дочерние элементы) задает свойство содержимого XAML некоторого объекта.By using element syntax where the content (inner text or child elements) is setting the XAML content property of an object.
  • С использованием синтаксиса коллекций (обычно это неявный синтаксис коллекций).By using a collection syntax (which is usually the implicit collection syntax).

Как и в случае с объявлением объекта, существование такого списка не означает, что любое свойство может задаваться при помощи каждой из методик.As with object declaration, this list doesn't imply that any property could be set with each of the techniques. Некоторые свойства поддерживают только одну методику.Some properties support only one of the techniques. Другие свойства поддерживают более одной формы. Например, определенные свойства могут использовать синтаксис элемента свойства или синтаксис атрибута.Some properties support more than one form; for example, there are properties that can use property element syntax, or attribute syntax. Фактические возможности зависят как от свойства, так и от типа объектов, которые оно использует.What's possible depends both on the property and on the object type that the property uses. Возможные варианты использования XAML описаны в справочных материалах по API среды выполнения Windows в разделе Синтаксис.In the Windows Runtime API reference, you'll see the XAML usages you can use in the Syntax section. Иногда имеется альтернативный вариант использования, также работающий, но более подробный.Sometimes there is an alternative usage that would work but would be more verbose. Такие подробные варианты использования приводятся не всегда, поскольку мы стараемся показывать вам лучшие способы и реальные сценарии использования свойства в XAML.Those verbose usages aren't always shown because we are trying to show you the best practices or the real world scenarios for using that property in XAML. Руководство по синтаксису XAML изложено в разделах Использование языка XAML страниц справки свойств, которые можно задавать в XAML.Guidance for XAML syntax is provided in the XAML Usage sections of reference pages for properties that can be set in XAML.

Некоторые свойства объектов не могут быть заданы в XAML любым способом, и их можно задать только с помощью кода.Some properties on objects cannot be set in XAML by any means, and can only be set using code. Как правило, это свойства, более подходящие для работы с кодом, а не с языком XAML.Usually these are properties that are more appropriate to work with in the code-behind, not in XAML.

Свойство "только для чтения" задать в XAML невозможно.A read-only property cannot be set in XAML. Даже в коде для определения типа владельца должен быть предусмотрен какой-либо другой способ, например перегрузка конструктора, метод вспомогательного приложения или поддержка вычисляемого свойства.Even in code, the owning type would have to support some other way to set it, like a constructor overload, helper method, or calculated property support. Вычисляемое свойство полагается на значения других устанавливаемых свойств, а иногда также и на событие со встроенным управлением. Такие возможности доступны в системе свойств зависимостей.A calculated property relies on the values of other settable properties plus sometimes an event with built-in handling; these features are available in the dependency property system. Подробнее о применении свойств зависимостей для поддержки вычисляемого свойства см. в разделе Обзор свойств зависимостей.For more info on how dependency properties are useful for calculated property support, see Dependency properties overview.

Синтаксис коллекций в языке XAML позволяет нам сделать вид, что мы задаем свойство для чтения, хотя на самом деле это не так.Collection syntax in XAML gives an appearance that you are setting a read-only property, but in fact you are not. См. раздел «Синтаксис коллекции» далее в этом разделе.See "Collection Syntax" later in this topic.

Задание свойства с помощью синтаксиса атрибутовSetting a property by using attribute syntax

Задание значения атрибута — обычный способ установки значения свойства в языках разметки, таких как XML или HTML.Setting an attribute value is the typical means by which you set a property value in a markup language, for example in XML or HTML. Задание атрибутов в XAML производится аналогично заданию значений атрибутов в XML.Setting XAML attributes is similar to how you set attribute values in XML. Имя атрибута указывается после имени элемента, заключается в теги и отделяется от имени элемента минимум одним пробелом.The attribute name is specified at any point within the tags following the element name, separated from element name by at least one whitespace. За именем атрибута следует знак равенства.The attribute name is followed by an equals sign. Значение атрибута заключается в кавычки.The attribute value is contained within a pair of quotes. Кавычки могут быть двойными или одинарными при условии, что они совпадают и заключают в себе значение.The quotes can be either double quotes or single quotes so long as they match and enclose the value. Само значение атрибута должно быть выражаемым как строка.The attribute value itself must be expressible as a string. Строка зачастую содержит символы чисел, но в XAML все значения атрибутов являются строковыми значениями, пока средство синтаксического анализа XAML не будет задействовано и не выполнит некоторые базовые преобразования значений.The string often contains numerals, but to XAML, all attribute values are string values until the XAML parser gets involved and does some basic value conversion.

В данном примере используется синтаксис атрибутов для четырех атрибутов, чтобы задать свойства Name, Width, Height и Fill объекта Rectangle.This example uses attribute syntax for four attributes to set the Name, Width, Height, and Fill properties of a Rectangle object.

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

Определение свойства с помощью синтаксиса элементов свойствSetting a property by using property element syntax

Многие свойства объектов можно задать с помощью синтаксиса элементов свойства.Many properties of an object can be set by using property element syntax. Элемент свойства выглядит следующим образом: свойство < объекта . property > .A property element looks like this: <object.property>.

При использовании синтаксиса элементов свойства создаются элементы свойств XAML для свойства, которое следует задать.To use property element syntax, you create XAML property elements for the property that you want to set. В стандартном XML этот элемент просто был бы сочтен элементом, в имени которого есть точка.In standard XML, this element would just be considered an element that has a dot in its name. Однако в XAML точка в имени элемента идентифицирует элемент как элемент свойства, а свойство должно быть членом объекта в реализации резервной модели объекта.However, in XAML, the dot in the element name identifies the element as a property element, with property expected to be a member of object in a backing object model implementation. Чтобы использовать синтаксис элементов свойства, необходимо иметь возможность указать объектный элемент для "заполнения" тегов элемента свойства.To use property element syntax, it must be possible to specify an object element in order to "fill" the property element tags. Элемент свойства всегда будет иметь определенное содержимое (один элемент, несколько элементов либо внутренний текст); невозможно иметь самодостаточный элемент свойства.A property element will always have some content (single element, multiple elements, or inner text); there's no point in having a self-closing property element.

В следующей грамматической конструкции свойство — имя свойства, которое следует задать, а propertyValueAsObjectElement — одиночный объектный элемент, который должен удовлетворять требованиям типа значения данного свойства.In the following grammar, property is the name of the property that you want to set and propertyValueAsObjectElement is a single object element, that's expected to satisfy the value type requirements of the property.

<object><object>

<объект . свойство><object.property>

propertyValueAsObjectElementpropertyValueAsObjectElement

</объект . свойство></object.property>

</object></object>

В следующем примере используется синтаксис элемента свойства, чтобы определить элемент Fill для Rectangle с помощью объектного элемента SolidColorBrush.The following example uses property element syntax to set the Fill of a Rectangle with a SolidColorBrush object element. (Внутри SolidColorBrush, Color задается как атрибут.) Проанализированный результат этого фрагмента XAML идентичен предыдущему примеру XAML, где элемент Fill был определен с помощью синтаксиса атрибута.(Within the SolidColorBrush, Color is set as an attribute.) The parsed result of this XAML is identical to the previous XAML example that set Fill using attribute syntax.

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

Словари XAML и объектно-ориентированное программированиеXAML vocabularies and object-oriented programming

Свойства и события, появляющиеся в качестве членов XAML типа XAML среды выполнения Windows, часто наследуются от базовых типов.Properties and events as they appear as XAML members of a Windows Runtime XAML type are often inherited from base types. Рассмотрим пример: <Button Background="Blue" .../>.Consider this example: <Button Background="Blue" .../>. Свойство Background не объявляется непосредственно в классе Button.The Background property is not an immediately declared property on the Button class. Вместо этого Background наследуется от базового класса Control.Instead, Background is inherited from the base Control class. Если вы обратитесь к справке по Button, то увидите, что списки членов содержат не менее одного унаследованного члена из каждой цепочки последовательных базовых классов: ButtonBase, Control, FrameworkElement, UIElement, DependencyObject.In fact, if you look at the reference topic for Button you'll see that the members lists contain at least one inherited member from each of a chain of successive base classes: ButtonBase, Control, FrameworkElement, UIElement, DependencyObject. В списке Свойства все свойства чтения-записи и свойства коллекции в части словаря XAML наследуются.In the Properties list, all the read-write properties and collection properties are inherited in a XAML vocabulary sense. Также наследуются события (например, различные события UIElement).Events (like the various UIElement events) are inherited too.

Если вы используете для справки по XAML руководство по среде выполнения Windows, учитывайте, что имя элемента, показанного в синтаксисе или даже в примере кода, иногда дается для типа, который изначально определяет свойство, поскольку данный раздел справки объединяет сведения о всех возможных типах, наследующих его от базового класса.If you use the Windows Runtime reference for XAML guidance, the element name that's shown in a syntax or even in example code is sometimes for the type that originally defines the property, because that reference topic is shared by all the possible types that inherit it from a base class. При использовании IntelliSense для XAML из Visual Studio в редакторе XML технология IntelliSense и ее раскрывающиеся списки значительно способствуют объединению наследованных элементов и предоставляют точный список атрибутов, которые можно установить, когда начата работа с элементом объекта как экземпляром класса.If you use Visual Studio's IntelliSense for XAML in the XML editor, the IntelliSense and its drop-downs do a great job of coalescing the inheritance and providing an accurate list of attributes that are available for setting once you've started with an object element for a class instance.

Свойства содержимого XAMLXAML content properties

Некоторые типы определяют одно из своих свойств так, что оно разрешает синтаксис содержимого XAML.Some types define one of their properties such that the property enables a XAML content syntax. При указании свойства содержимого в языке XAML можно опускать элемент данного свойства определенного типа.For the XAML content property of a type, you can omit the property element for that property when specifying it in XAML. Или же можно задать свойство как значение внутреннего текста, вставив этот внутренний текст прямо внутри тегов объектного элемента типа-владельца.Or, you can set the property to an inner text value by providing that inner text directly within the owning type's object element tags. Свойства содержимого XAML поддерживают синтаксис непосредственной разметки для такого свойства и улучшают восприятие языка XAML пользователем за счет уменьшения вложений.XAML content properties support straightforward markup syntax for that property and makes the XAML more human-readable by reducing the nesting.

Если для свойства доступен синтаксис содержимого XAML, он приводится в разделе "Язык XAML" статьи Синтаксис справочной документации среды выполнения Windows для данного свойства.If a XAML content syntax is available, that syntax will be shown in the "XAML" sections of Syntax for that property in the Windows Runtime reference documentation. Например, страница свойства Child для Border показывает синтаксис содержимого XAML вместо синтаксиса элемента свойства, чтобы установить значение Border.Child одного объекта для Border, как показано далее:For example, the Child property page for Border shows XAML content syntax instead of property element syntax to set the single-object Border.Child value of a Border, like this:

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

Если свойство, объявленное как свойство содержимого XAML, принадлежит к типу Object или типу String, синтаксис содержимого XAML поддерживает часть, которая изначально является внутренним текстом модели документа XML, а именно строку между открывающим и закрывающим тегами объекта.If the property that is declared as the XAML content property is the Object type, or is type String, then the XAML content syntax supports what's basically inner text in the XML document model: a string between the opening and closing object tags. Например, страница свойства Text для TextBlock отображает синтаксис содержимого XAML, имеющий значение внутреннего текста для определения Text, но строка Text никогда не появляется в разметке.For example, the Text property page for TextBlock shows XAML content syntax that has an inner text value to set Text, but the string "Text" never appears in the markup. Вот пример использования:Here's an example usage:

<TextBlock>Hello!</TextBlock>

Если свойство содержимого XAML существует для класса, это указывается в разделе справки для данного класса в подразделе "Атрибуты".If a XAML content property exists for a class, that's indicated in the reference topic for the class, in the "Attributes" section. Ищите значение ContentPropertyAttribute.Look for the value of the ContentPropertyAttribute. Данный атрибут использует поле с именем Name.This attribute uses a named field "Name". Значение Name — это имя свойства класса, являющееся свойством содержимого XAML.The value of "Name" is the name of the property of that class that is the XAML content property. Например, на странице справки Border отобразится: ContentProperty("Name=Child").For example, on the Border reference page, you'll see this: ContentProperty("Name=Child").

Одно из важных правил синтаксиса XAML, которое следует упомянуть, — невозможность смешения свойства содержимого XAML и других элементов свойств, установленных для элемента.One important XAML syntax rule we should mention is that you can't intermix the XAML content property and other property elements you set on the element. Свойство содержимого XAML должно устанавливаться либо полностью перед всеми элементами свойств, либо полностью после.The XAML content property must be set entirely before any property elements, or entirely after. Например, такой код XAML недопустим: For example this is invalid XAML:

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

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

Все образцы синтаксиса выше задавали свойства для отдельных объектов.All of the syntaxes shown thus far are setting properties to single objects. Но многие сценарии пользовательского интерфейса требуют, чтобы у определенного родительского элемента было несколько дочерних элементов.But many UI scenarios require that a given parent element can have multiple child elements. Например, в пользовательском интерфейсе формы для ввода должно быть несколько текстовых полей, надписей и, возможно, кнопка "Отправить".For example, a UI for an input form needs several text box elements, some labels, and perhaps a "Submit" button. Но если для доступа ко всем элементам использовать объектную модель программирования, они, как правило, будут элементами в одном свойстве коллекции (вместо каждого элемента как значения отдельного свойства).Still, if you were to use a programming object model to access these multiple elements, they would typically be items in a single collection property, rather than each item being the value of different properties. XAML поддерживает наличие нескольких дочерних элементов, а также поддерживает типичную реализацию базовой коллекции, рассматривая свойства, использующие тип коллекции как неявный, и проводя специальную обработку всех дочерних элементов типа коллекции.XAML supports multiple child elements as well as supporting a typical backing collection model by treating properties that use a collection type as implicit, and performing special handling for any child elements of a collection type.

Многие свойства коллекции также определяются как свойство содержимого XAML для данного класса.Many collection properties are also identified as the XAML content property for the class. Объединение неявной обработки коллекции и синтаксиса содержимого XAML часто наблюдается в типах, используемых для компоновки органов управления, таких как панели, представления или элементы управления.The combination of implicit collection processing and XAML content syntax is frequently seen in types used for control compositing, such as panels, views, or items controls. Например, в следующем примере показан простейший код XAML для компоновки двух одноранговых элементов пользовательского интерфейса в StackPanel.For example, the following example shows the simplest possible XAML for compositing two peer UI elements within a StackPanel.

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

Механизм синтаксиса коллекций языка XAMLThe mechanism of XAML collection syntax

На первый взгляд может показаться, что XAML применяет здесь "набор" свойства коллекции только для чтения.It might at first appear that XAML is enabling a "set" of the read-only collection property. На самом деле XAML применяет добавление элементов к существующей коллекции.In reality, what XAML enables here is adding items to an existing collection. Язык XAML и процессоры XAML, реализующие поддержку XAML, полагаются на соглашение в резервных типах коллекций, чтобы сделать возможным этот синтаксис.The XAML language and XAML processors implementing XAML support rely on a convention in backing collection types to enable this syntax. Как правило, существует резервное свойство, такое как индексатор, или свойство Items, относящееся к конкретным элементам коллекции.Typically there is a backing property such as an indexer or Items property that refers to specific items of the collection. Обычно это свойство не является явным в синтаксисе XAML.Generally, that property is not explicit in the XAML syntax. Для коллекций базовым механизмом синтаксического анализа XAML является не свойство, а метод. В большинстве случаев это метод Add.For collections, the underlying mechanism for XAML parsing is not a property, but a method: specifically, the Add method in most cases. Когда процессор XAML обрабатывает один или несколько объектных элементов в синтаксисе коллекции XAML, каждый из таких объектов сначала создается из элемента. Затем все созданные объекты по порядку добавляются к содержащей их коллекции с помощью метода Add коллекции.When the XAML processor encounters one or more object elements within a XAML collection syntax, each such object is first created from an element, then each new object is added in order to the containing collection by calling the collection's Add method.

Когда средство синтаксического анализа XAML добавляет элементы в коллекцию, именно логика метода Add определяет, является ли конкретный элемент XAML допустимым дочерним элементом объекта коллекции.When a XAML parser adds items to a collection, it is the logic of the Add method that determines whether a given XAML element is a permissible item child of the collection object. Многие типы коллекций строго определяются резервной реализацией. Поэтому предполагается, что данные, которые переданы с помощью параметра ввода Add, будут иметь тип, совпадающий с типом параметра Add.Many collection types are strongly typed by the backing implementation, meaning that the input parameter of Add expects that whatever is passed must be a type match with the Add parameter type.

В отношении свойств коллекций внимательно отнеситесь к явному указанию коллекции как объектного элемента.For collection properties, be careful about when you try to specify the collection explicitly as an object element. Средство синтаксического анализа XAML создает новый объект при любом обнаружении объектного элемента.A XAML parser will create a new object whenever it encounters an object element. Если используемое свойство коллекции относится к типу "только для чтения", исключение анализа XAML можно отбросить.If the collection property you're trying to use is read-only, this can throw a XAML parse exception. Используйте синтаксис неявной коллекции, и такое исключение исчезнет.Just use the implicit collection syntax, and you won't see that exception.

Когда стоит использовать синтаксис атрибутов, а когда — элементов свойствWhen to use attribute or property element syntax

Все свойства, которые можно задать в языке XAML, поддерживают синтаксис атрибутов или элементов свойств для прямого задания значений. Но не для всех свойств эти виды синтаксиса взаимозаменяемы.All properties that support being set in XAML will support attribute or property element syntax for direct value setting, but potentially will not support either syntax interchangeably. Некоторые свойства поддерживают оба вида синтаксиса, некоторые поддерживают дополнительные варианты синтаксиса, такие как свойство содержимого XAML.Some properties do support either syntax, and some properties support additional syntax options like a XAML content property. Тип синтаксиса XAML, поддерживаемого свойством, зависит от типа объекта, который свойство использует как свой тип.The type of XAML syntax supported by a property depends on the type of object that the property uses as its property type. Если тип свойства — это простой тип, например double (число с плавающей точкой или десятичное), integer, Boolean или string, свойство всегда будет поддерживать синтаксис атрибутов.If the property type is a primitive type, such as a double (float or decimal), integer, Boolean, or string, the property always supports attribute syntax.

Синтаксис атрибутов также можно использовать для задания свойства, если тип объектов, используемый для задания этого свойства, можно получить путем обработки строки.You can also use attribute syntax to set a property if the object type you use to set that property can be created by processing a string. Для примитивов это работает всегда, тип преобразования встроен в средство синтаксического анализа.For primitives, this is always the case, the type conversion is built in to the parser. Но некоторые другие типы объектов также можно создать, используя строку, указанную как значение атрибута вместо объектного элемента внутри элемента свойства.However, certain other object types can also be created by using a string specified as an attribute value, rather than an object element within a property element. Чтобы это работало, требуется преобразование основообразующего типа, поддерживаемое либо указанным свойством, либо поддерживаемое в целом для всех значений, использующих данный тип свойства.For this to work, there has to be an underlying type conversion, supported either by that particular property or supported generally for all values that use that property type. Строковый параметр атрибута используется, чтобы задать свойства, важные для инициализации нового объектного значения.The string value of the attribute is used to set properties that are important for the initialization of the new object value. Преобразователь определенного типа также потенциально может создавать различные подклассы обычного типа свойств в зависимости от своего уникального способа обработки информации в строке.Potentially, a specific type converter can also create different subclasses of a common property type, depending on how it uniquely processes information in the string. У типов объектов, поддерживающих такое поведение, в разделе справочной документации, посвященном синтаксису, будет приведена специальная грамматическая конструкция.Object types that support this behavior will have a special grammar listed in the syntax section of the reference documentation. В качестве примера синтаксис XAML для Brush демонстрирует использование синтаксиса атрибута для создания нового значения SolidColorBrush для любого свойства типа Brush (при этом существует множество свойств Brush в XAML среды выполнения Windows).As an example, the XAML syntax for Brush shows how an attribute syntax can be used to create a new SolidColorBrush value for any property of type Brush (and there are many Brush properties in Windows Runtime XAML).

Логика и правила синтаксического анализа языка XAMLXAML parsing logic and rules

Иногда бывает информативно выполнять чтение XAML аналогично тому, как это делает средство синтаксического анализа XAML: как набор строковых маркеров, обнаруживаемых в линейном порядке.Sometime's it's informative to read the XAML in a similar way to how a XAML parser must read it: as a set of string tokens encountered in a linear order. Средство синтаксического анализа XAML должно интерпретировать данные маркеры в рамках набора правил, являющихся частью определения метода работы XAML.A XAML parser must interpret these tokens under a set of rules that are part of the definition of how XAML works.

Задание значения атрибута — обычный способ установки значения свойства в языках разметки, таких как XML или HTML.Setting an attribute value is the typical means by which you set a property value in a markup language, for example in XML or HTML. В следующем синтаксисе objectName — объект, экземпляр которого следует создать, propertyName — имя свойства, которое нужно задать для этого объекта, а propertyValue — значение, которое следует задать.In the following syntax, objectName is the object you want to instantiate, propertyName is the name of the property that you want to set on that object, and propertyValue is the value to set.

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

-or-

<objectName propertyName="propertyValue">

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

</objectName>

Оба варианта синтаксиса позволяют объявить объект и задать свойство для этого объекта.Either syntax enables you to declare an object and set a property on that object. Хотя первый пример ограничивается единственным элементом в разметке, синтаксический анализ этой разметки процессором XAML будет состоять из отдельных шагов.Although the first example is a single element in markup, there are actually discrete steps here with regard to how a XAML processor parses this markup.

Сначала присутствие объектного элемента укажет, что необходимо создать экземпляр нового объекта objectName.First, the presence of the object element indicates that a new objectName object must be instantiated. Свойство экземпляра PropertyName может быть установлено только после того, как такой экземпляр существует.Only after such an instance exists can the instance property propertyName be set on it.

Другим правилом XAML является возможность установки атрибутов любого элемента в любом порядке.Another rule of XAML is that attributes of an element must be able to be set in any order. Например, нет различия между <Rectangle Height="50" Width="100" /> и <Rectangle Width="100" Height="50" />.For example, there's no difference between <Rectangle Height="50" Width="100" /> and <Rectangle Width="100" Height="50" />. Применяемый порядок является вопросом стиля.Which order you use is a matter of style.

Примечание    . Разработчики XAML часто передают соглашения о заказах при использовании областей конструктора, отличных от редактора XML, но можно свободно редактировать этот код XAML позже, чтобы изменить порядок атрибутов или добавить новые.Note  XAML designers often promote ordering conventions if you use design surfaces other than the XML editor, but you can freely edit that XAML later, to reorder the attributes or introduce new ones.

Присоединенные свойстваAttached properties

Язык XAML расширяет XML, добавляя элемент синтаксиса, известный как присоединенное свойство.XAML extends XML by adding a syntax element known as an attached property. Аналогично синтаксису элемента свойства синтаксис присоединенного свойства содержит точку, и эта точка имеет особое значение при анализе XAML.Similar to the property element syntax, the attached property syntax contains a dot, and the dot holds special meaning to XAML parsing. В частности, точка отделяет поставщик присоединенного свойства и имя свойства.Specifically, the dot separates the provider of the attached property, and the property name.

В XAML присоединенные свойства задаются с помощью синтаксиса AttachedPropertyProvider.PropertyName Ниже приведен пример определения присоединенного свойства Canvas.Left в XAML.In XAML, you set attached properties by using the syntax AttachedPropertyProvider.PropertyName Here is an example of how you can set the attached property Canvas.Left in XAML:

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

Можно задать присоединенное свойство для элементов, которые не имеют свойств с таким именем в резервном типе, и в таком случае оно будет работать подобно глобальному свойству или атрибуту, определенному другим пространством имен XML, как атрибут xml:space.You can set the attached property on elements that don't have a property of that name in the backing type, and in that way they function somewhat like a global property, or an attribute defined by a different XML namespace like the xml:space attribute.

В XAML среды выполнения Windows имеются присоединенные свойства, поддерживающие такие сценарии:In Windows Runtime XAML you'll see attached properties that support these scenarios:

  • Дочерние элементы могут информировать родительские контейнерные панели о способе их поведения в макете: Canvas, Grid, VariableSizedWrapGrid.Child elements can inform parent container panels how they should behave in layout: Canvas, Grid, VariableSizedWrapGrid.
  • Использование элемента управления может влиять на поведение важной составляющей управления, выводимой из шаблона элемента управления: ScrollViewer, VirtualizingStackPanel.Control usages can influence behavior of an important control part that comes from the control template: ScrollViewer, VirtualizingStackPanel.
  • Использование службы, доступной в соответствующем классе, когда служба и использующий ее класс не имеют общего механизма наследования: Typography, VisualStateManager, AutomationProperties, ToolTipService.Using a service that's available in a related class, where the service and the class that uses it don't share inheritance: Typography, VisualStateManager, AutomationProperties, ToolTipService.
  • Нацеливание анимации: Storyboard.Animation targeting: Storyboard.

Подробнее см. в разделе Общие сведения о присоединенных свойствах.For more info, see Attached properties overview.

Значения литералов с символом "{"Literal "{" values

Так как открывающая фигурная скобка { является открывающей последовательностью расширения разметки, для указания строкового литерального значения, начинающегося с "", используется escape-последовательность { .Because the opening brace symbol { is the opening of the markup extension sequence, you use an escape sequence to specify a literal string value that starts with "{". Escape-последовательность — " { } ".The escape sequence is "{}". Например, чтобы указать строковое значение, которое представляет собой отдельную открывающую фигурную скобку, укажите значение атрибута в виде " { } { ".For example, to specify a string value that is a single opening brace, specify the attribute value as "{}{". Также можно использовать альтернативные кавычки (например, " в значении атрибута, разделенном " "), чтобы предоставить { значение" "в виде строки.You can also use the alternative quotation marks (for example, a ' within an attribute value delimited by "") to provide a "{" value as a string.

Примечание    " \ }" также работает, если он находится внутри атрибута, заключенного в кавычки.Note  "\}" also works if it's inside a quoted attribute.  

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

Многие свойства API среды выполнения Windows используют в качестве значений перечисления.Many properties in the Windows Runtime API use enumerations as values. Если таким членом является свойство типа "чтение-запись", для его установки можно задать значение атрибута.If the member is a read-write property you can set such a property by providing an attribute value. Значение перечисления, используемое как значение свойства, указывается при помощи неполной формы имени константы.You identify which enumeration value to use as the value of the property by using the unqualified name of the constant name . Например, в языке XAML определение UIElement.Visibility происходит следующим образом: <Button Visibility="Visible"/>.For example here's how to set UIElement.Visibility in XAML: <Button Visibility="Visible"/>. Здесь Visible как строка напрямую сопоставляется с именованной константой перечисления VisibilityVisible.Here the "Visible" as a string is directly mapped to a named constant of the Visibility enumeration, Visible.

  • Не используйте полную форму, такой способ не даст результата.Don't use a qualified form, it won't work. Например, такой код XAML недопустим: <Button Visibility="Visibility.Visible"/>For example, this is invalid XAML: <Button Visibility="Visibility.Visible"/>.
  • Не используйте значение константы.Don't use the value of the constant. Другими словами, не используйте целое число перечисления, присутствующее явным или неявным образом в зависимости от определения перечисления.In other words, don't rely on the integer value of the enumeration that's there explicitly or implicitly depending on how the enumeration was defined. На первый взгляд такой способ работает, однако в XAML и в коде это крайне нежелательно, поскольку есть вероятность, что вы полагаетесь на временные данные о реализации.Although it might appear to work, it's a bad practice either in XAML or in code because you're relying on what could be a transient implementation detail. Например, не делайте так: <Button Visibility="1"/>.For example, don't do this: <Button Visibility="1"/>.

Примечание    . В справочных разделах, посвященных интерфейсам API, которые используют XAML и используют перечисления, щелкните ссылку на тип перечисления в разделе « значение свойства » синтаксиса.Note  In reference topics for APIs that use XAML and use enumerations, click the link to the enumeration type in the Property value section of Syntax. Ссылка ведет на страницу перечисления, где вы найдете именованные константы для данного перечисления.This links to the enumeration page where you can discover the named constants for that enumeration.

Перечисления могут быть перечислениями флагов — это означает, что они имеют атрибут FlagsAttribute.Enumerations can be flagwise, meaning that they are attributed with FlagsAttribute. Если требуется указать комбинацию значений для этих перечислений флагов как значение атрибута XAML, используйте имена констант перечисления, разделяя их запятыми без пробелов (",").If you need to specify a combination of values for a flagwise enumeration as a XAML attribute value, use the name of each enumeration constant, with a comma (,) between each name, and no intervening space characters. Подобные атрибуты не часто встречаются в словаре XAML среды выполнения Windows, однако ManipulationModes является примером, в котором поддерживается определение значения перечисления флагов в XAML.Flagwise attributes aren't common in the Windows Runtime XAML vocabulary, but ManipulationModes is an example where setting a flagwise enumeration value in XAML is supported.

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

Иногда можно встретить синтаксис XAML, где типом свойства является интерфейс.In rare cases you'll see a XAML syntax where the type of a property is an interface. В системе типов XAML тип, в котором реализован этот интерфейс, при анализе принимается как значение.In the XAML type system, a type that implements that interface is acceptable as a value when parsed. Необходимо создать экземпляр такого типа, который будет служить значением.There must be a created instance of such a type available to serve as the value. Интерфейс используется в синтаксисе XAML в качестве типа в свойствах Command и CommandParameter класса ButtonBase.You'll see an interface used as a type in the XAML syntax for Command and CommandParameter properties of ButtonBase. Эти свойства поддерживают шаблоны проектирования Model-View-ViewModel (MVVM), где интерфейс ICommand является контрактом взаимодействия представлений и моделей.These properties support Model-View-ViewModel (MVVM) design patterns where the ICommand interface is the contract for how the views and models interact.

Соглашения о заполнителях XAML в справке среды выполнения WindowsXAML placeholder conventions in Windows Runtime reference

Если вы знакомились с разделом Синтаксис в справочных материалах по API среды выполнения Windows, которые могут использовать XAML, вероятно, вы обратили внимание на значительное количество заполнителей в синтаксисе.If you've examined any of the Syntax section of reference topics for Windows Runtime APIs that can use XAML, you've probably seen that the syntax includes quite a few placeholders. Синтаксис XAML отличается от синтаксиса C#, Microsoft Visual Basic или расширений компонентов Visual C++ (C++/CX), так как синтаксис XAML ориентирован на использование.XAML syntax is different than the C#, Microsoft Visual Basic or Visual C++ component extensions (C++/CX) syntax because the XAML syntax is a usage syntax. Он предлагает конечный вариант использования в ваших собственных файлах XAML, но не слишком ограничивает значения, которые вы можете использовать.It's hinting at your eventual usage in your own XAML files, but without being over-prescriptive about the values you can use. Обычно использование описывает тип грамматики, в которой одновременно применяются литералы и заполнители, и определяет некоторые заполнители в разделе Значения XAML.So usually the usage describes a type of grammar that mixes literals and placeholders, and defines some of the placeholders in the XAML Values section.

Имена типов и элементов, используемые в синтаксисе XAML для свойства, относятся к типу, который определяет свойство в исходном варианте.When you see type names / element names in a XAML syntax for a property, the name that's shown is for the type that originally defines the property. Однако XAML среды выполнения Windows поддерживает модель наследования класса для классов на основе DependencyObject.But Windows Runtime XAML supports a class inheritance model for the DependencyObject-based classes. Поэтому зачастую можно использовать атрибут для класса, который не является в прямом смысле определяющим классом, а представляет собой производный класс от класса, изначально определявшего свойство или атрибут.So you can often use an attribute on a class that's not literally the defining class, but instead derives from a class that first defined the property/attribute. Например, можно установить Visibility в качестве атрибута в любом производном классе UIElement, используя для этого глубокое наследование.For example, you can set Visibility as an attribute on any UIElement derived class using a deep inheritance. Например: <Button Visibility="Visible" />.For example: <Button Visibility="Visible" />. Поэтому не следует слишком буквально воспринимать имя элемента, отображаемое в синтаксисе XAML; синтаксис может быть применим для элементов, представляющих данный класс, а также для элементов, представляющих производный класс.So don't take the element name shown in any XAML usage syntax too literally; the syntax may be viable for elements representing that class, and also elements that represent a derived class. В тех случаях, когда в реальном синтаксисе очень сложно или невозможно использовать тип, показанный в качестве определяющего элемента, имя этого типа намеренно используется в синтаксисе в нижнем регистре.In cases where it's rare or impossible for the type shown as the defining element to be in a real-world usage, that type name is deliberately lowercased in the syntax. Например, синтаксис для UIElement.Visibility следующий:For example, the syntax you see for UIElement.Visibility is :

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

Многие разделы синтаксиса XAML включают заполнители в группу "Использование", а затем определяют их в разделе Значения XAML , следующем сразу после раздела Синтаксис .Many XAML syntax sections include placeholders in the "Usage" that are then defined in a XAML Values section that's directly under the Syntax section.

В разделах использования XAML применяются также различные подготовленные к использованию заполнители.XAML usage sections also use various generalized placeholders. Такие заполнители не определяются каждый раз в Значениях XAML, так как постепенно вы станете догадываться или запомните, что они обозначают.These placeholders aren't redefined every time in XAML Values, because you'll guess or eventually learn what they represent. По нашему мнению, большинству читателей надоест снова и снова видеть их в Значениях XAML, поэтому мы исключили их из определений.We think most readers would get tired of seeing them in XAML Values again and again so we left them out of the definitions. Ниже приведен для справки список некоторых таких заполнителей и их значений в общем случае.For reference, here's a list of some of these placeholders and what they mean in a general sense:

  • object: теоретически любое значение объекта, но на практике зачастую ограничено некоторыми типами объектов, такими как выбор "строка или объект"; за дополнительной информацией следует обратиться к разделу "Примечания" на странице справки.object: theoretically any object value, but often practically limited to certain types of objects such as a string-or-object choice, and you should check the Remarks on the reference page for more info.
  • объект свойство: объект свойство в сочетании используется в тех случаях, когда отображаемый синтаксис относится к типу, который можно использовать в качестве значения атрибута для многих свойств.object property: object property in combination is used for cases where the syntax being shown is the syntax for a type that can be used as an attribute value for many properties. Например, Использование атрибутов Xaml, отображаемое для объекта Brush, содержит следующее: <объект свойство="predefinedColorName"/>For example, the Xaml Attribute Usage shown for Brush includes: <object property="predefinedColorName"/>
  • eventhandler: отображается как значение атрибута для каждого синтаксиса XAML, показанного для атрибута события.eventhandler: This appears as the attribute value for every XAML syntax shown for an event attribute. Здесь вводится имя для функции обработчика событий.What you're supplying here is the function name for an event handler function. Эту функцию следует определить в выделенном коде для страницы XAML.That function must be defined in the code-behind for the XAML page. На уровне программирования эта функция должна соответствовать подписи делегата обрабатываемого события, в противном случае код вашего приложения скомпилировать не удастся.At the programming level, that function must match the delegate signature of the event that you're handling, or your app code won't compile. Однако этот момент касается программирования, а не XAML, поэтому мы ничего не говорим о типе делегата в синтаксисе XAML.But that's really a programming consideration, not a XAML consideration, so we don't try to hint anything about the delegate type in the XAML syntax. Если вы хотите узнать, какой из делегатов следует реализовать для события, обратитесь к разделу Информация о событии в справке для данного события (строка таблицы Делегат).If you want to know which delegate you should be implementing for an event, that's in the Event information section of the reference topic for the event, in a table row that's labeled Delegate.
  • enumMemberName: отображается в синтаксисе атрибутов для всех перечислений.enumMemberName: shown in attribute syntax for all enumerations. Существует сходный заполнитель для свойств, использующих значение перечисления, но обычно он предшествует заполнителю с указанием на имя перечисления.There's a similar placeholder for properties that use an enumeration value, but it usually prefixes the placeholder with a hint of the enumeration's name. Например, синтаксис FrameworkElement. FlowDirection <*FrameworkElement *FlowDirection= "* фловдиректионмембернаме *"/>.For example, the syntax shown for FrameworkElement.FlowDirection is <frameworkElement*FlowDirection=" flowDirectionMemberName*"/>. Если вы находитесь на одной из справочных страниц для свойств, нажмите ссылку на тип перечисления, приведенную в разделе Значение свойства, рядом с надписью Тип:.If you're on one of those property reference pages, click the link to the enumeration type that appears in the Property Value section, next to the text Type:. В качестве значения атрибута свойства, использующего перечисление, можно использовать любую строку, указанную в столбце Член списка Члены.For the attribute value of a property that uses that enumeration, you can use any string that is listed in the Member column of the Members list.
  • double, int, string, bool: примитивные типы, известные для языка XAML.double, int, string, bool: These are primitive types known to the XAML language. Если программирование осуществляется на C# или Visual Basic, эти типы сопоставляются с эквивалентными типами Microsoft .NET, например Double, Int32, String и Boolean, и в таких типах .NET можно использовать любые члены при работе со значениями, определенными в XAML, в выделенном коде .NET.If you're programming using C# or Visual Basic, these types are projected to Microsoft .NET equivalent types such as Double, Int32, String and Boolean, and you can use any members on those .NET types when you work with your XAML-defined values in .NET code-behind. Если программирование выполняется на C++/CX, можно использовать примитивные типы C++, однако можно также считать их эквивалентами типов, определенных в пространстве имен Platform, например Platform::String.If you're programming using C++/CX, you'll use the C++ primitive types but you can also consider these equivalent to types defined by the Platform namespace, for example Platform::String. Иногда для конкретных свойств могут существовать дополнительные ограничения на значения.There will sometimes be additional value restrictions for particular properties. Но обычно соответствующее примечание дается в разделе Значение свойства или "Примечания", а не в разделе XAML, поскольку такие ограничения относятся как к использованию в коде, так и к использованию в XAML.But you'll usually see these noted in a Property value section or Remarks section and not in a XAML section, because any such restrictions apply both to code usages and XAML usages.

Советы и рекомендации, замечания по стилюTips and tricks, notes on style

  • Расширения разметки в целом описаны в основном обзоре языка XAML.Markup extensions in general are described in the main XAML overview. Но в наибольшей степени на руководство в этой теме влияет расширение разметки StaticResource (и связанное ThemeResource).But the markup extension that most impacts the guidance given in this topic is the StaticResource markup extension (and related ThemeResource). Функция расширения разметки StaticResource — разрешить разложение языка XAML на повторно используемые ресурсы из ResourceDictionary в XAML.The function of the StaticResource markup extension is to enable factoring your XAML into reusable resources that come from a XAML ResourceDictionary. Практически всегда шаблоны элементов управления и соответствующие стили определяются в ResourceDictionary.You almost always define control templates and related styles in a ResourceDictionary. Часто составляющие определения шаблонов элементов управления или особого стиля приложения также определяются в ResourceDictionary, например SolidColorBrush для цвета, применяемого приложением к различным элементам пользовательского интерфейса более одного раза.You often define the smaller parts of a control template definition or app-specific style in a ResourceDictionary too, for example a SolidColorBrush for a color that your app uses more than once for different parts of UI. За счет использования StaticResource любое свойство, для установки которого при других обстоятельствах требуется применение элемента свойства, теперь может устанавливаться в синтаксисе атрибута.By using a StaticResource, any property that would otherwise require a property element usage to set can now be set in attribute syntax. Но преимущества разложения языка XAML для повторного использования не ограничиваются обычным упрощением синтаксиса уровня страницы.But the benefits of factoring XAML for reuse go beyond just simplifying the page-level syntax. Подробнее: ResourceDictionary и ссылки на ресурсы XAML.For more info, see ResourceDictionary and XAML resource references.
  • Несколько различных соглашений по применению пробела и перевода строки в XAML включены в соответствующие примеры.You'll see several different conventions for how white space and line feeds are applied in XAML examples. В частности, имеется ряд соглашений по разрыву объектных элементов, для которых установлено большое количество различных атрибутов.In particular, there are different conventions for how to break up object elements that have a lot of different attributes set. Это — вопрос стиля.That's just a matter of style. XML-редактор Visual Studio по умолчанию применяет некоторые стилистические правила при редактировании языка XAML, но это можно изменить в настройках.The Visual Studio XML editor applies some default style rules when you edit XAML, but you can change these in the settings. Лишь в редких случаях пробел в файле на XAML считается значимым; дополнительные сведения см. в разделе XAML и пробел.There are a small number of cases where the white space in a XAML file is considered significant; for more info see XAML and whitespace.