Обзор XAML (WPF)XAML overview (WPF)

В этом разделе описаны возможности языка XAML и показано, как использовать язык XAML для написания приложений Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF).This topic describes the features of the XAML language and demonstrates how you can use XAML to write Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) applications. В частности, в этом разделе описывается реализация XAML в WPFWPF.This topic specifically describes XAML as implemented by WPFWPF. Сам язык XAML — это более широкое понятие языка, чем WPFWPF.XAML itself is a larger language concept than WPFWPF.

Что это такое язык XAML?What is XAML?

XAML — это декларативный язык разметки.XAML is a declarative markup language. Применительно к модели программирования .NET Framework XAML упрощает создание ИПUI для приложения .NET Framework.As applied to the .NET Framework programming model, XAML simplifies creating a ИПUI for a .NET Framework application. Можно создать видимые элементы ИПUI в декларативной XAML-разметке, а затем отделить определение ИПUI от логики времени выполнения, используя файлы кода программной части, присоединенные к разметке с помощью определений разделяемых классов.You can create visible ИПUI elements in the declarative XAML markup, and then separate the ИПUI definition from the run-time logic by using code-behind files, joined to the markup through partial class definitions. Язык XAML напрямую представляет создание экземпляров объектов в конкретном наборе резервных типов, определенных в сборках.XAML directly represents the instantiation of objects in a specific set of backing types defined in assemblies. В этом заключается его отличие от большинства других языков разметки, которые, как правило, представляют собой интерпретируемые языки без прямой связи с системой резервных типов.This is unlike most other markup languages, which are typically an interpreted language without such a direct tie to a backing type system. Язык XAML обеспечивает рабочий процесс, позволяющий нескольким участникам разрабатывать ИПUI и логику приложения, используя потенциально различные средства.XAML enables a workflow where separate parties can work on the ИПUI and the logic of an application, using potentially different tools.

При представлении в виде текста файлы XAML являются XML-файлами, которые обычно имеют расширение .xaml.When represented as text, XAML files are XML files that generally have the .xaml extension. Файлы можно сохранять в любой кодировке, поддерживаемой XML, но обычно используется кодировка UTF-8.The files can be encoded by any XML encoding, but encoding as UTF-8 is typical.

В следующем примере показано, как можно создать кнопку как часть ИПUI.The following example shows how you might create a button as part of a ИПUI. Этот пример дает лишь общее представление о том, как в языке XAML представлены распространенные метафоры программирования для такого объекта как ИПUI (это неполный пример).This example is just intended to give you a flavor of how XAML represents common ИПUI programming metaphors (it is not a complete sample).

<StackPanel>
  <Button Content="Click Me"/>
</StackPanel>

Краткое описание синтаксиса XAMLXAML syntax in brief

Далее приводятся описание основных форм синтаксиса XAML и короткий пример разметки.The following sections explain the basic forms of XAML syntax, and give a short markup example. В этих разделах не приводится полная информация о каждой форме синтаксиса (например, представление в системе резервных типов).These sections are not intended to provide complete information about each syntax form, such as how these are represented in the backing type system. Дополнительные сведения об особенностях синтаксиса XAML для каждой формы синтаксиса, представленной в этом разделе см. в разделе Подробное описание синтаксиса XAML.For more information about the specifics of XAML syntax for each of the syntax forms introduced in this topic, see XAML Syntax In Detail.

Значительная часть материалов в следующих нескольких разделах будет уже знакома тем, кто имеет опыт работы с языком XML.Much of the material in the next few sections will be elementary to you, if you have previous familiarity with the XML language. Это обусловлено базовыми принципами разработки языка XAML.This is a consequence of one of the basic design principles of XAML. На языке XAML определяются собственные, но эти концепции работать внутри XML язык и форма разметки.The XAML language defines concepts of its own, but these concepts work within the XML language and markup form.

Объектные элементы XAMLXAML object elements

Объектный элемент обычно объявляет экземпляр типа.An object element typically declares an instance of a type. Этот тип определен в сборках, предоставляющих резервные типы для технологии, в которой XAML используется как язык.That type is defined in the assemblies that provide the backing types for a technology that uses XAML as a language.

Синтаксис объектного элемента всегда начинается с открывающей угловой скобки (<).Object element syntax always starts with an opening angle bracket (<). За ней следует имя типа, для которого требуется создать экземпляр.This is followed by the name of the type where you want to create an instance. (Имя может содержать префикс. Описание этого понятия будет приведено далее.) После этого при необходимости можно объявить атрибуты объектного элемента.(The name can possibly include a prefix, a concept that will be explained later.) After this, you can optionally declare attributes on the object element. Для завершения тега объектного элемента введите закрывающую угловую скобку (>).To complete the object element tag, end with a closing angle bracket (>). Вместо этого можно использовать самозакрывающуюся форму, в которой отсутствует содержимое, установив в конце тега косую черту и закрывающую угловую скобку (/>).You can instead use a self-closing form that does not have any content, by completing the tag with a forward slash and closing angle bracket in succession (/>). Например, снова рассмотрим предыдущий фрагмент разметки.For example, look at the previously shown markup snippet again:

<StackPanel>
  <Button Content="Click Me"/>
</StackPanel>

В нем указано два объектных элемента: <StackPanel> (с содержимым и последующим закрывающим тегом) и <Button .../> (самозакрывающаяся форма с несколькими атрибутами).This specifies two object elements: <StackPanel> (with content, and a closing tag later), and <Button .../> (the self-closing form, with several attributes). Объектные элементы StackPanel и Button сопоставлены с именем класса, определенным WPFWPF и являющимся частью сборок WPFWPF.The object elements StackPanel and Button each map to the name of a class that is defined by WPFWPF and is part of the WPFWPF assemblies. При задании тега объектного элемента создается инструкция обработки XAML для создания нового экземпляра.When you specify an object element tag, you create an instruction for XAML processing to create a new instance. Каждый экземпляр создается путем вызова конструктора по умолчанию для базового типа при синтаксическом анализе и загрузке XAML-кода.Each instance is created by calling the default constructor of the underlying type when parsing and loading the XAML.

Синтаксис атрибутов (свойства)Attribute syntax (properties)

Свойства объекта часто можно выразить в виде атрибутов объектного элемента.Properties of an object can often be expressed as attributes of the object element. Синтаксис атрибутов именует свойство, задаваемое в синтаксисе атрибутов, за которым следует оператор присваивания (=).An attribute syntax names the property that is being set in attribute syntax, followed by the assignment operator (=). Значение атрибута всегда задается как строка, заключенная в кавычки.The value of an attribute is always specified as a string that is contained within quotation marks.

Синтаксис атрибутов — это наиболее простой синтаксис задания свойств, интуитивно понятный разработчикам, которые раньше использовали языки разметки.Attribute syntax is the most streamlined property setting syntax and is the most intuitive syntax to use for developers who have used markup languages in the past. Например, следующая разметка создает кнопку с красным текстом и синим фоном и отображает текст, заданный как Content.For example, the following markup creates a button that has red text and a blue background in addition to display text specified as Content.

<Button Background="Blue" Foreground="Red" Content="This is a button"/>

Синтаксис элемента свойстваProperty element syntax

Для некоторых свойств объектного элемента невозможен синтаксис атрибутов, так как объект или сведения, необходимые для задания значения свойства, не могут быть адекватно представлены в строке, указываемой в кавычках, с соблюдением ограничений синтаксиса атрибутов.For some properties of an object element, attribute syntax is not possible, because the object or information necessary to provide the property value cannot be adequately expressed within the quotation mark and string restrictions of attribute syntax. В этих случаях может использоваться другой синтаксис — синтаксис элементов свойств.For these cases, a different syntax known as property element syntax can be used.

Для открывающего тега элемента свойства используется следующий синтаксис: <имя_типа.имя_свойства>.The syntax for the property element start tag is <typeName.propertyName>. В большинстве случаев содержимое тега является объектным элементом типа, к которому может принадлежать значение этого свойства.Generally, the content of that tag is an object element of the type that the property takes as its value . После указания содержимого необходимо завершить элемент свойства закрывающим тегом.After specifying content, you must close the property element with an end tag. Для закрывающего тега используется синтаксис </имя_типа.имя_свойства>.The syntax for the end tag is </typeName.propertyName>.

Если синтаксис атрибутов допустим, его использование, как правило, более удобно и приводит к созданию более компактной разметки, но часто выбор связан только со стилем, а не с техническими ограничениями.If an attribute syntax is possible, using the attribute syntax is typically more convenient and enables a more compact markup, but that is often just a matter of style, not a technical limitation. В следующем примере те же свойства задаются так же, как в предыдущем примере синтаксиса атрибутов, но на этот раз с помощью синтаксиса элементов свойств для всех свойств Button.The following example shows the same properties being set as in the previous attribute syntax example, but this time by using property element syntax for all properties of the Button.

<Button>
  <Button.Background>
    <SolidColorBrush Color="Blue"/>
  </Button.Background>
  <Button.Foreground>
    <SolidColorBrush Color="Red"/>
  </Button.Foreground>
  <Button.Content>
    This is a button
  </Button.Content>
</Button>

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

Язык XAML включает некоторые оптимизации, делающие разметку более удобной для чтения.The XAML language includes some optimizations that produce more human-readable markup. Одна из оптимизаций заключается в том, что, если определенное свойство принимает тип коллекции, элементы, объявленные в разметке как дочерние в пределах значения этого свойства, становятся частью коллекции.One such optimization is that if a particular property takes a collection type, then items that you declare in markup as child elements within that property's value become part of the collection. В этом случае коллекция дочерних объектных элементов является значением, которое задается для свойства коллекции.In this case a collection of child object elements is the value being set to the collection property.

В примере показан синтаксис коллекции для задания значения GradientStops свойство:The following example shows collection syntax for setting values of the GradientStops property:

<LinearGradientBrush>  
  <LinearGradientBrush.GradientStops>  
    <!-- no explicit new GradientStopCollection, parser knows how to find or create -->  
    <GradientStop Offset="0.0" Color="Red" />  
    <GradientStop Offset="1.0" Color="Blue" />  
  </LinearGradientBrush.GradientStops>  
</LinearGradientBrush>  

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

XAML указывает функцию языка, за счет чего класс может назначить только одно из своих свойств как свойство содержимого XAML.XAML specifies a language feature whereby a class can designate exactly one of its properties to be the XAML content property. Дочерние элементы данного объектного элемента используются для задания значения этого свойства содержимого.Child elements of that object element are used to set the value of that content property. Другими словами, для свойства содержимого (и только для него) можно опустить элемент свойства, указав это свойство в XAML-разметке, и тем самым создать более наглядную метафору родительского/дочернего элементов в разметке.In other words, for the content property uniquely, you can omit a property element when setting that property in XAML markup and produce a more visible parent/child metaphor in the markup.

Например Border указывает свойство content от Child.For example, Border specifies a content property of Child. Следующие два Border элементы обрабатываются одинаково.The following two Border elements are treated identically. Первый элемент использует преимущества синтаксиса свойства содержимого и опускает элемент свойства Border.Child.The first one takes advantage of the content property syntax and omits the Border.Child property element. Второй пример явно показывает Border.Child.The second one shows Border.Child explicitly.

<Border>  
  <TextBox Width="300"/>  
</Border>  
<!--explicit equivalent-->  
<Border>  
  <Border.Child>  
    <TextBox Width="300"/>  
  </Border.Child>  
</Border>  

Для языка XAML действует следующее правило: значение свойства содержимого XAML должно быть задано полностью либо до, либо после любых других элементов свойств данного объектного элемента.As a rule of the XAML language, the value of a XAML content property must be given either entirely before or entirely after any other property elements on that object element. Например, следующая разметка не компилируется.For instance, the following markup does not compile:

<Button>I am a   
  <Button.Background>Blue</Button.Background>  
  blue button</Button>  

Дополнительные сведения об этом ограничении свойств содержимого XAML см. в подразделе "Свойства содержимого XAML" раздела Подробное описание синтаксиса XAML.For more information about this restriction on XAML content properties, see the "XAML Content Properties" section of XAML Syntax In Detail.

Текстовое содержимоеText content

Небольшое количество элементов XAML могут непосредственно обрабатывать текст как содержимое.A small number of XAML elements can directly process text as their content. Это происходит в одной из следующих ситуаций.To enable this, one of the following cases must be true:

  • Класс должен объявить свойство содержимого и свойства содержимого должен относиться к типу, присваиваемому строке (тип может быть Object).The class must declare a content property, and that content property must be of a type assignable to a string (the type could be Object). Например, любой ContentControl использует Content как его свойство содержимого и он является типом Object, и поддерживает следующее использование в практическом ContentControl например Button: <Button>Hello</Button>.For instance, any ContentControl uses Content as its content property and it is type Object, and this supports the following usage on a practical ContentControl such as a Button: <Button>Hello</Button>.

  • Тип должен объявлять преобразователь типов, при этом текстовое содержимое используется как текст инициализации для данного преобразователя типов.The type must declare a type converter, in which case the text content is used as initialization text for that type converter. Например, <Brush>Blue</Brush>.For example, <Brush>Blue</Brush>. Этот случай менее распространен.This case is less common in practice.

  • Тип должен быть известным типом-примитивом языка XAML.The type must be a known XAML language primitive.

Синтаксис содержимого свойства и коллекции в сочетанииContent properties and collection syntax combined

Рассмотрим следующий пример.Consider this example:

<StackPanel>  
  <Button>First Button</Button>  
  <Button>Second Button</Button>  
</StackPanel>  

Здесь каждый Button является дочерним элементом элемента StackPanel.Here, each Button is a child element of StackPanel. Это рациональная и интуитивно понятная разметка, в которой опущены два тега по двум разным причинам.This is a streamlined and intuitive markup that omits two tags for two different reasons.

  • Опущен элемент свойства StackPanel.Children: StackPanel является производным от Panel.Omitted StackPanel.Children property element: StackPanel derives from Panel. Panel Определяет Panel.Children свойства содержимого XAML его.Panel defines Panel.Children as its XAML content property.

  • Опущен объектный элемент UIElementCollection: Panel.Children свойство принимает тип UIElementCollection, который реализует IList.Omitted UIElementCollection object element: The Panel.Children property takes the type UIElementCollection, which implements IList. Тег элемента коллекции можно опустить, на основании правил XAML, касающихся обработки коллекций, такие как IList.The collection's element tag can be omitted, based on the XAML rules for processing collections such as IList. (В этом случае UIElementCollection фактически не может быть создан, так как он не предоставляет конструктор по умолчанию, и вот почему UIElementCollection показан закомментированным объектного элемента).(In this case, UIElementCollection actually cannot be instantiated because it does not expose a default constructor, and that is why the UIElementCollection object element is shown commented out).

<StackPanel>  
  <StackPanel.Children>  
    <!--<UIElementCollection>-->  
    <Button>First Button</Button>  
    <Button>Second Button</Button>  
    <!--</UIElementCollection>-->  
  </StackPanel.Children>  
</StackPanel>  

Синтаксис атрибутов (события)Attribute syntax (events)

Синтаксис атрибутов также можно использовать для элементов, которые являются событиями, а не свойствами.Attribute syntax can also be used for members that are events rather than properties. В этом случае имя атрибута является именем события.In this case, the attribute's name is the name of the event. События для языка XAML реализованы в WPF таким образом, что значение атрибута является именем обработчика, реализующего делегат этого события.In the WPF implementation of events for XAML, the attribute's value is the name of a handler that implements that event's delegate. Например, в следующей разметке назначается обработчик для Click события Button , созданного в разметке:For example, the following markup assigns a handler for the Click event to a Button created in markup:

<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="ExampleNamespace.ExamplePage">
  <Button Click="Button_Click" >Click Me!</Button>
</Page>

Помимо этого примера синтаксиса атрибутов, имеется больше информации по событиям и XAML в WPF.There is more to events and XAML in WPF than just this example of the attribute syntax. Например, может возникнуть вопрос, что представляет и как определяется указанный здесь атрибут ClickHandler.For example, you might wonder what the ClickHandler referenced here represents and how it is defined. Ответ можно найти в следующем подразделе События и код программной части XAML этого раздела.This will be explained in the upcoming Events and XAML Code-Behind section of this topic.

Регистр и пробелы в XAMLCase and white space in XAML

Вообще говоря, в языке XAML учитывается регистр символов.XAML is generally speaking case sensitive. При разрешении резервных типов в WPF XAML регистр учитывается по тем же правилам, что и для CLR.For purposes of resolving backing types, WPF XAML is case sensitive by the same rules that the CLR is case sensitive. Объектные элементы, элементы свойств и имена атрибутов должны быть указаны с учетом регистра символов при сравнении по имени с базовым типом в сборке или с элементом типа.Object elements, property elements, and attribute names must all be specified by using the sensitive casing when compared by name to the underlying type in the assembly, or to a member of a type. В ключевых словах и примитивах в языке XAML также учитывается регистр.XAML language keywords and primitives are also case sensitive. В значениях регистр учитывается не всегда.Values are not always case sensitive. Учет регистра для значений будет зависеть от поведения преобразователя типов, связанного со свойством, которое принимает значение, или с соответствующим типом значения свойства.Case sensitivity for values will depend on the type converter behavior associated with the property that takes the value, or the property value type. Например, свойства, принимающие Boolean типа может принимать либо true или True как эквивалентные, но только в том случае, так как преобразование строки типа синтаксический анализатор WPF XAML Boolean уже рассматривает их как эквиваленты.For example, properties that take the Boolean type can take either true or True as equivalent values, but only because the native WPF XAML parser type conversion for string to Boolean already permits these as equivalents.

WPF XAML обработчики и сериализаторы будет игнорировать или удалить все незначимые пробелы и будет нормализовать любой значащий пробел.WPF XAML processors and serializers will ignore or drop all nonsignificant white space, and will normalize any significant white space. Это согласуется с рекомендациями по умолчанию поведение пустого пространства в спецификации XAML.This is consistent with the default white-space behavior recommendations of the XAML specification. Данное поведение типично только при задании строки в свойствах содержимого XAML.This behavior is generally only of consequence when you specify strings within XAML content properties. Проще говоря, XAML преобразует пробелы, символы табуляции и перевода строки в пробелы, а затем сохраняет один пробел, если таковой найден с любого конца непрерывной строки.In simplest terms, XAML converts space, linefeed and tab characters into spaces, and then preserves one space if found at either end of a contiguous string. Полное описание обработки пробелов в XAML не рассматривается в этом разделе.The full explanation of XAML white-space handling is not covered in this topic. Дополнительные сведения см. в разделе обработки в XAML пробелов.For details, see White space processing in XAML.

Расширения разметкиMarkup extensions

Расширения разметки являются понятием языка XAML.Markup extensions are a XAML language concept. При использовании для предоставления значения синтаксиса атрибутов фигурные скобки ({ и }) указывают на использование расширения разметки.When used to provide the value of an attribute syntax, curly braces ({ and }) indicate a markup extension usage. При обработке XAML расширения разметки обрабатываются иначе, чем значения атрибутов, обычно рассматриваемые как литеральная строка или как значение, которое может быть преобразовано в строку.This usage directs the XAML processing to escape from the general treatment of attribute values as either a literal string or a string-convertible value.

Наиболее распространенными расширениями разметки, используемыми при программирования приложений WPFWPF, являются Binding, используемое для выражений привязки данных, и ссылки на ресурсы StaticResource и DynamicResource.The most common markup extensions used in WPFWPF application programming are Binding, used for data binding expressions, and the resource references StaticResource and DynamicResource. Используя расширения разметки, можно использовать синтаксис атрибутов для указания значений свойств, которые в целом не поддерживают синтаксис атрибутов.By using markup extensions, you can use attribute syntax to provide values for properties even if that property does not support an attribute syntax in general. В расширениях разметки часто используются промежуточные типы выражений для включения функций, которые присутствуют только во время выполнения, например откладывание значений или ссылка на другие объекты.Markup extensions often use intermediate expression types to enable features such as deferring values or referencing other objects that are only present at run time.

Например, следующий элемент задает значение Style свойства с помощью синтаксиса атрибутов.For example, the following markup sets the value of the Style property using attribute syntax. Style Свойство принимает экземпляр Style класс, который по умолчанию не может быть создан с помощью строки синтаксиса атрибутов.The Style property takes an instance of the Style class, which by default could not be instantiated by an attribute syntax string. Но в этом случае атрибут ссылается на определенное расширение разметки StaticResource.But in this case, the attribute references a particular markup extension, StaticResource. Когда это расширение разметки обрабатывается, оно возвращает ссылку на стиль, экземпляр которого был ранее создан в качестве ключевого ресурса в словаре ресурсов.When that markup extension is processed, it returns a reference to a style that was previously instantiated as a keyed resource in a resource dictionary.

<Page.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
  <Style TargetType="Border" x:Key="PageBackground">
    <Setter Property="Background" Value="Blue"/>
  </Style>
</Page.Resources>
<StackPanel>
  <Border Style="{StaticResource PageBackground}">
  </Border>
</StackPanel>

Список всех расширений разметки для XAML, реализованных в WPF, см. в разделе Расширения XAML WPF.For a reference listing of all markup extensions for XAML implemented specifically in WPF, see WPF XAML Extensions. Список расширений разметки, определенных в сборке System.Xaml и более доступных для реализаций XAML платформы .NET Framework, см. в разделе Возможности пространства имен языка XAML (x:).For a reference listing of the markup extensions that are defined by System.Xaml and are more widely available for .NET Framework XAML implementations, see XAML Namespace (x:) Language Features. Дополнительные сведения о понятиях расширений разметки см. в разделе Расширения разметки и XAML WPF.For more information about markup extension concepts, see Markup Extensions and WPF XAML.

Преобразователи типовType converters

В разделе Краткое описание синтаксиса XAML было отмечено, что необходимо обеспечить возможность задать значение атрибута строкой.In the XAML Syntax in Brief section, it was stated that the attribute value must be able to be set by a string. Основная собственная обработка преобразования строк в другие типы объектов или простые значения основана на String сам тип, помимо некоторой собственной обработки для определенных типов, таких как DateTime или Uri.The basic, native handling of how strings are converted into other object types or primitive values is based on the String type itself, in addition to native processing for certain types such as DateTime or Uri. Но многие типы WPFWPF или члены этих типов расширяют основное поведение обработки атрибутов строк таким образом, что экземпляры более сложных типов объектов могут быть заданы как строки и атрибуты.But many WPFWPF types or members of those types extend the basic string attribute processing behavior, in such a way that instances of more complex object types can be specified as strings and attributes.

Thickness Структуры является примером типа, для которого включено преобразование типа для использования XAML.The Thickness structure is an example of a type that has a type conversion enabled for XAML usages. Thickness Указывает измерения в рамках вложенного прямоугольника и используется в качестве значения для свойств, таких как Margin.Thickness indicates measurements within a nested rectangle and is used as the value for properties such as Margin. Размещая преобразователь типов на Thickness, все свойства, использующие Thickness , легче указать в XAML, так как они могут быть указаны как атрибуты.By placing a type converter on Thickness, all properties that use a Thickness are easier to specify in XAML because they can be specified as attributes. В следующем примере используется синтаксис, преобразование и атрибут типа, чтобы предоставить значение для Margin:The following example uses a type conversion and attribute syntax to provide a value for a Margin:

<Button Margin="10,20,10,30" Content="Click me"/>

В предыдущем примере синтаксиса атрибутов эквивалентен следующему более подробному примеру синтаксиса, где Margin задается с помощью синтаксиса элемента свойства, содержащего Thickness объектного элемента.The previous attribute syntax example is equivalent to the following more verbose syntax example, where the Margin is instead set through property element syntax containing a Thickness object element. Четыре ключевых свойств Thickness заданы как атрибуты в новом экземпляре:The four key properties of Thickness are set as attributes on the new instance:

<Button Content="Click me">
  <Button.Margin>
    <Thickness Left="10" Top="20" Right="10" Bottom="30"/>
  </Button.Margin>
</Button>

Примечание

Кроме того, существует ограниченное количество объектов, для которых преобразование типов является единственным открытым способом присвоения свойству значения нужного типа без использования подкласса, так как у самого типа отсутствует конструктор по умолчанию.There are also a limited number of objects where the type conversion is the only public way to set a property to that type without involving a subclass, because the type itself does not have a default constructor. Например, Cursor.An example is Cursor.

Дополнительные сведения о поддержке преобразователя типов для синтаксиса атрибутов см. в разделе TypeConverters и XAML.For more information on how type conversion and its use for attribute syntax is supported, see TypeConverters and XAML.

Корневые элементы XAML и пространства имен XAMLXAML root elements and XAML namespaces

Файл XAML должен иметь только один корневой элемент, чтобы одновременно быть файлом XMLXML с правильным форматом и допустимым файлом XAML.A XAML file must have only one root element, in order to be both a well-formed XMLXML file and a valid XAML file. В скриптах WPF используется корневой элемент, имеющий значимый в модели приложения WPF (например, Window или Page для страницы, ResourceDictionary для внешнего словаря или Application для определения приложения).For typical WPF scenarios, you use a root element that has a prominent meaning in the WPF application model (for example, Window or Page for a page, ResourceDictionary for an external dictionary, or Application for the application definition). В следующем примере показано корневой элемент обычного файла XAML для WPFWPF страницы с корневым элементом Page.The following example shows the root element of a typical XAML file for a WPFWPF page, with the root element of Page.

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Page>

Корневой элемент также содержит атрибуты xmlns и xmlns:x.The root element also contains the attributes xmlns and xmlns:x. Эти атрибуты указывают обработчику XAML, какие пространства имен XAML содержат определения типов для резервных типов, на которые будет ссылаться разметка в качестве элементов.These attributes indicate to a XAML processor which XAML namespaces contain the type definitions for backing types that the markup will reference as elements. Атрибут xmlns специально указывает пространство имен XAML по умолчанию.The xmlns attribute specifically indicates the default XAML namespace. В пределах пространства имен XAML по умолчанию объектные элементы в разметке можно указывать без префикса.Within the default XAML namespace, object elements in the markup can be specified without a prefix. Для большинства сценариев приложения WPFWPF и практически для всех примеров, приведенных в разделах WPFWPF SDKSDK, пространство имен XAML по умолчанию сопоставлено с пространством имен WPFWPF http://schemas.microsoft.com/winfx/2006/xaml/presentationhttp://schemas.microsoft.com/winfx/2006/xaml/presentation.For most WPFWPF application scenarios, and for almost all of the examples given in the WPFWPF sections of the SDKSDK, the default XAML namespace is mapped to the WPFWPF namespace http://schemas.microsoft.com/winfx/2006/xaml/presentationhttp://schemas.microsoft.com/winfx/2006/xaml/presentation. Атрибут xmlns:x указывает дополнительное пространство имен XAML, которое сопоставлено пространству имен языка http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml.The xmlns:x attribute indicates an additional XAML namespace, which maps the XAML language namespace http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml.

Это использование атрибутов xmlns для определения области использования и сопоставления области видимости имен согласовано со спецификацией XML 1.0.This usage of xmlns to define a scope for usage and mapping of a namescope is consistent with the XML 1.0 specification. Области видимости имен XAML отличаются от областей видимости имен XML только тем, что область видимости имен XAML также подразумевает некоторую информацию о резервном копировании элементов области видимости имен по типам в случае разрешения типов и анализа XAML.XAML namescopes are different from XML namescopes only in that a XAML namescope also implies something about how the namescope's elements are backed by types when it comes to type resolution and parsing the XAML.

Обратите внимание, что атрибуты xmlns строго необходимы только для корневого элемента каждого XAML-файла.Note that the xmlns attributes are only strictly necessary on the root element of each XAML file. Определения xmlns будут применяться ко всем элементам-потомкам корневого элемента (такое поведение также соответствует спецификации XML 1.0 для xmlns.). Атрибуты xmlns также разрешены для других элементов ниже корня и будут применены ко всем элементам-потомкам определяющего элемента.xmlns definitions will apply to all descendant elements of the root element (this behavior is again consistent with the XML 1.0 specification for xmlns.) xmlns attributes are also permitted on other elements underneath the root, and would apply to any descendant elements of the defining element. Впрочем, частое определение или повторное определение пространств имен XAML может сделать стиль разметки XAML трудным для человеческого восприятия.However, frequent definition or redefinition of XAML namespaces can result in a XAML markup style that is difficult to read.

В WPFWPF реализация обработчика XAML включает инфраструктуру, содержащую информацию о ключевых сборках WPF.The WPFWPF implementation of its XAML processor includes an infrastructure that has awareness of the WPF core assemblies. Ключевые сборки WPFWPF содержат типы, поддерживающие сопоставления WPFWPF с пространством имен XAML по умолчанию.The WPFWPF core assemblies are known to contain the types that support the WPFWPF mappings to the default XAML namespace. Это осуществляется за счет конфигурации, являющейся частью файла построения проекта, построения WPF и систем проекта.This is enabled through configuration that is part of your project build file and the WPF build and project systems. Таким образом, объявление пространства имен XAML как xmlns по умолчанию — это все, что нужно, чтобы ссылаться на элементы XAML, полученные из сборок WPFWPF.Therefore, declaring the default XAML namespace as the default xmlns is all that is necessary in order to reference XAML elements that come from WPFWPF assemblies.

Префикс x:The x: prefix

В предыдущем примере корневого элемента префикс x: использовался для сопоставления пространства имен XAML http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml, которое является выделенным пространством имен XAML, поддерживающим конструкции языка XAML.In the previous root element example, the prefix x: was used to map the XAML namespace http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml, which is the dedicated XAML namespace that supports XAML language constructs. Префикс x: используется для сопоставления данного пространства имен XAML в шаблонах для проектов, в примерах и в документации по всему этому SDKSDK.This x: prefix is used for mapping this XAML namespace in the templates for projects, in examples, and in documentation throughout this SDKSDK. Пространство имен XAML для языка XAML содержит несколько конструкций программирования, которые очень часто используются в XAML.The XAML namespace for the XAML language contain several programming constructs that you will use very frequently in your XAML. Ниже приведен список наиболее распространенных конструкций программирования с префиксом x:, которые могут вам потребоваться.The following is a listing of the most common x: prefix programming constructs you will use:

  • x: Key: задает уникальный ключ для каждого ресурса в ResourceDictionary (или аналогичных словарях в других платформах).x:Key: Sets a unique key for each resource in a ResourceDictionary (or similar dictionary concepts in other frameworks). x:Key применяется примерно в 90 % случаев использования сопоставления x: в разметке типичных приложений WPF.x:Key will probably account for 90% of the x: usages you will see in a typical WPF application's markup.

  • x:Class. Задает пространство имен CLRCLR и имя класса, предоставляющего код программной части для страницы XAML.x:Class: Specifies the CLRCLR namespace and class name for the class that provides code-behind for a XAML page. Согласно модели программирования WPF, такой класс должен присутствовать для поддержки кода программной части, поэтому сопоставление x: присутствует почти всегда, даже если ресурсы отсутствуют.You must have such a class to support code-behind per the WPF programming model, and therefore you almost always see x: mapped, even if there are no resources.

  • x:Name. Задает имя объекта во время выполнения для экземпляра, который существует в коде во время выполнения после обработки объектного элемента.x:Name: Specifies a run-time object name for the instance that exists in run-time code after an object element is processed. Как правило, на практике часто используется свойство, определенное в WPF, эквивалентное x:Name.In general, you will frequently use a WPF-defined equivalent property for x:Name. Такие свойства сопоставляются непосредственно с резервным свойством CLR, а потому более удобны для программирования приложений, где код времени выполнения часто используется для поиска именованных элементов из инициализированного XAML-кода.Such properties map specifically to a CLR backing property and are thus more convenient for application programming, where you frequently use run time code to find the named elements from initialized XAML. Наиболее распространенные из таких свойств — FrameworkElement.Name.The most common such property is FrameworkElement.Name. Можно по-прежнему использовать x: Name при эквивалентных уровня среды WPF Name свойство не поддерживается в определенного типа.You might still use x:Name when the equivalent WPF framework-level Name property is not supported in a particular type. Это происходит в некоторых сценариях анимации.This occurs in certain animation scenarios.

  • x:Static. Позволяет использовать ссылку, возвращающую статическое значение, в остальном не являющееся свойством, совместимым с XAML.x:Static: Enables a reference that returns a static value that is not otherwise a XAML-compatible property.

  • x: Type: создает Type ссылку на основании имени типа.x:Type: Constructs a Type reference based on a type name. Это используется для указания атрибутов, которые принимают Type, такие как Style.TargetType, хотя часто свойство имеет собственную строку-к-Type преобразование таким образом, x: Type является использование расширения разметки необязательно.This is used to specify attributes that take Type, such as Style.TargetType, although frequently the property has native string-to-Type conversion in such a way that the x:Type markup extension usage is optional.

Существуют дополнительные конструкции программирования в пространстве имен XAML/с префиксом x:, которые применяются не так часто.There are additional programming constructs in the x: prefix/XAML namespace, which are not as common. Дополнительные сведения см. в разделе Возможности пространства имен языка XAML (x:).For details, see XAML Namespace (x:) Language Features.

Пользовательские префиксы и пользовательские типы в XAMLCustom prefixes and custom types in XAML

При использовании собственных пользовательских сборок или сборок PresentationCore, PresentationFramework и WindowsBase за пределами ядра WPF можно указать сборку как часть пользовательского сопоставления xmlns.For your own custom assemblies, or for assemblies outside the WPF core of PresentationCore, PresentationFramework and WindowsBase, you can specify the assembly as part of a custom xmlns mapping. Затем можно указывать в пользовательском XAML-коде ссылки на типы из этой сборки, если в типе правильно реализована поддержка требуемых средств XAML.You can then reference types from that assembly in your XAML, so long as that type is correctly implemented to support the XAML usages you are attempting.

Ниже приведен очень общий пример работы пользовательских префиксов в разметке XAML.The following is a very basic example of how custom prefixes work in XAML markup. Префикс custom определен в теге корневого элемента и сопоставляется с конкретной сборкой, упакованной и доступной в приложении.The prefix custom is defined in the root element tag, and mapped to a specific assembly that is packaged and available with the application. Эта сборка содержит тип NumericUpDown, который реализуется для поддержки общего использования XAML, а также использования наследования класса, которое можно вставить в данную конкретную точку модели содержимого XAML WPF.This assembly contains a type NumericUpDown, which is implemented to support general XAML usage as well as using a class inheritance that permits its insertion at this particular point in a WPF XAML content model. Экземпляр этого элемента управления NumericUpDown объявлен как объектный элемент, префикс обеспечивает, что анализатор XAML "знает", какое пространство имен XAML содержит тип и, следовательно, где находится резервная сборка, содержащая определение типа.An instance of this NumericUpDown control is declared as an object element, using the prefix so that a XAML parser knows which XAML namespace contains the type, and therefore where the backing assembly is that contains the type definition.

<Page  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
    xmlns:custom="clr-namespace:NumericUpDownCustomControl;assembly=CustomLibrary"  
    >  
  <StackPanel Name="LayoutRoot">  
    <custom:NumericUpDown Name="numericCtrl1" Width="100" Height="60"/>  
...  
  </StackPanel>  
</Page>  

Дополнительные сведения о пользовательских типах в языке XAML см. в разделе Код XAML и пользовательские классы для WPF.For more information about custom types in XAML, see XAML and Custom Classes for WPF.

Дополнительные сведения об отношении пространств имен XML и пространств имен кода программной части в сборках см. в разделе Пространства имен XAML и сопоставление пространств имен для WPF XAML.For more information about how XML namespaces and the namespaces of the backing code in assemblies are related, see XAML Namespaces and Namespace Mapping for WPF XAML.

События и код программной части XAMLEvents and XAML code-behind

В большинстве приложений WPFWPF содержатся как разметка XAML, так и код программной части.Most WPFWPF applications consist of both XAML markup and code-behind. В проекте XAML записывается как .xaml файл и CLRCLR языка, например Microsoft Visual Basic или C# используется для записи файл с выделенным кодом.Within a project, the XAML is written as a .xaml file, and a CLRCLR language such as Microsoft Visual Basic or C# is used to write a code-behind file. При компиляции разметки в файле XAML (в составе модели приложений и программирования WPF) расположение файла кода программной части для файла XAML определяется путем указания пространства имен и класса как атрибута x:Class корневого элемента XAML-кода.When a XAML file is markup compiled as part of the WPF programming and application models, the location of the XAML code-behind file for a XAML file is identified by specifying a namespace and class as the x:Class attribute of the root element of the XAML.

В приведенных примерах было использовано несколько кнопок, но ни с одной из этих кнопок не было ассоциировано логическое поведение.In the examples so far, you have seen several buttons, but none of these buttons had any logical behavior associated with them yet. Первичным механизмом добавления поведения для объектного элемента на уровне приложения является использование существующего события элементного класса и написание специального обработчика для этого события, которое вызывается при возникновении этого события во время выполнения.The primary application-level mechanism for adding a behavior for an object element is to use an existing event of the element class, and to write a specific handler for that event that is invoked when that event is raised at run time. Имя события и имя обработчика для использования указываются в разметке, тогда как код, который реализует обработчик, определен в коде программной части.The event name and the name of the handler to use are specified in the markup, whereas the code that implements your handler is defined in the code-behind.

<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="ExampleNamespace.ExamplePage">
  <Button Click="Button_Click" >Click Me!</Button>
</Page>
namespace ExampleNamespace
{
  public partial class ExamplePage
  {
    void Button_Click(object sender, RoutedEventArgs e)
    {
      Button b = e.Source as Button;
      b.Foreground = Brushes.Red;
    }
  }
}
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    Dim b As Button = e.Source
    b.Foreground = Brushes.Red
End Sub

Обратите внимание, что файл кода программной части использует пространство имен CLR ExampleNamespace и объявляет ExamplePage как разделяемый класс в этом пространстве имен.Notice that the code-behind file uses the CLR namespace ExampleNamespace and declares ExamplePage as a partial class within that namespace. Это аналогично значению атрибута x:Class ExampleNamespace.ExamplePage,This parallels the x:Class attribute value of ExampleNamespace.ExamplePage предоставленному в корне разметки.that was provided in the markup root. Компилятор разметки WPF создает разделяемый класс для любого скомпилированного файла XAML путем создания класса, производного от типа корневого элемента.The WPF markup compiler will create a partial class for any compiled XAML file, by deriving a class from the root element type. При предоставлении кода программной части, который также определяет тот же разделяемый класс, результирующий код объединяется внутри того же пространства имен и класса скомпилированного приложения.When you provide code-behind that also defines the same partial class, the resulting code is combined within the same namespace and class of the compiled application.

Дополнительные сведения о требованиях к созданию кода программной части в WPF см. в подразделе "Код программной части, обработчик событий и требования частичного класса" раздела Код программной части и XAML в WPF.For more information about requirements for code-behind programming in WPF, see the "Code-behind, Event Handler, and Partial Class Requirements" section of Code-Behind and XAML in WPF.

Если создание отдельного файла кода программной части нежелательно, то можно также встроить код в файл XAML.If you do not want to create a separate code-behind file, you can also inline your code in a XAML file. Однако встроенный код является менее гибким методом, имеющим значительные ограничения.However, inline code is a less versatile technique that has substantial limitations. Дополнительные сведения см. в разделе Код программной части и XAML в WPF.For details, see Code-Behind and XAML in WPF.

Перенаправленные событияRouted events

Одна из наиболее важных возможностей в WPFWPF — перенаправленное событие.A particular event feature that is fundamental to WPFWPF is a routed event. Перенаправленные события позволяют элементу обрабатывать событие, которое было вызвано другим элементом, пока они связаны через отношение дерева.Routed events enable an element to handle an event that was raised by a different element, as long as the elements are connected through a tree relationship. При задании обработки события атрибутом XAML перенаправленное событие может отслеживаться и обрабатываться любым элементом, включая те, для которых это событие не указано в таблице членов класса.When specifying event handling with a XAML attribute, the routed event can be listened for and handled on any element, including elements that do not list that particular event in the class members table. Это достигается путем уточнения атрибута имени события именем класса владельца.This is accomplished by qualifying the event name attribute with the owning class name. Например, родительский StackPanel в текущем StackPanel / Button пример может зарегистрировать обработчик для кнопки дочернего элемента Click событий с помощью атрибута Button.Click на StackPanel элемент объекта с именем обработчика в качестве значения атрибута.For instance, the parent StackPanel in the ongoing StackPanel / Button example could register a handler for the child element button's Click event by specifying the attribute Button.Click on the StackPanel object element, with your handler name as the attribute value. Дополнительные сведения о принципах работы перенаправленных событий см. в разделе Общие сведения о перенаправленных событиях.For more information about how routed events work, see Routed Events Overview.

Именованные элементы XAMLXAML named elements

По умолчанию экземпляр объекта, созданный в графе объекта путем обработки объектного элемента XAML, не имеет уникального идентификатора или ссылки на объект.By default, the object instance that is created in an object graph by processing a XAML object element does not possess a unique identifier or object reference. Напротив, если конструктор вызывается в коде, результат конструктора почти всегда используется для указания созданного экземпляра в качестве значения переменной, чтобы на него можно было ссылаться в дальнейшем коде.In contrast, if you call a constructor in code, you almost always use the constructor result to set a variable to the constructed instance, so that you can reference the instance later in your code. Для предоставления стандартизованного доступа к объектам, созданным с помощью определения разметки, в языке XAML определяется атрибут x:Name.In order to provide standardized access to objects that were created through a markup definition, XAML defines the x:Name attribute. Можно задать значение атрибута x:Name для любого объектного элемента.You can set the value of the x:Name attribute on any object element. В коде программной части выбранный идентификатор эквивалентен переменной экземпляра, которая ссылается на созданный экземпляр.In your code-behind, the identifier you choose is equivalent to an instance variable that refers to the constructed instance. Именованные элементы во всех отношениях действуют так, как если бы они были экземплярами объекта (имя только ссылается на этот экземпляр), и в приложении код программной части может ссылаться на именованные элементы для обработки взаимодействий времени выполнения.In all respects, named elements function as if they were object instances (the name references that instance), and your code-behind can reference the named elements to handle run-time interactions within the application. Эта связь между экземплярами и переменными выполняется компилятором разметки WPF XAML, и в частности функции например InitializeComponent , не рассматриваемые в этом разделе подробно.This connection between instances and variables is accomplished by the WPF XAML markup compiler, and more specifically involve features and patterns such as InitializeComponent that will not be discussed in detail in this topic.

Элементы XAML уровня среды WPF наследуют Name свойство, которое эквивалентно значению XAML, который определен x:Name атрибута.WPF framework-level XAML elements inherit a Name property, which is equivalent to the XAML defined x:Name attribute. Некоторые другие классы также предоставляют эквиваленты уровня свойств для x:Name, который также обычно определяется как свойство Name.Certain other classes also provide property-level equivalents for x:Name, which is also generally defined as a Name property. Вообще говоря, если не удается найти свойство Name в таблице членов для выбранного элемента или типа, вместо него следует использовать атрибут x:Name.Generally speaking, if you cannot find a Name property in the members table for your chosen element/type, use x:Name instead. x:Name Значения будут обеспечивают идентификатор элемента XAML, который может использоваться во время выполнения, либо определенными подсистемами, либо вспомогательными методами, такими как FindName.The x:Name values will provide an identifier to a XAML element that can be used at run time, either by specific subsystems or by utility methods such as FindName.

В следующем примере задается Name на StackPanel элемент.The following example sets Name on a StackPanel element. Затем обработчик на Button внутри этого StackPanel ссылки StackPanel через его ссылку на экземпляр buttonContainer как задается Name.Then, a handler on a Button within that StackPanel references the StackPanel through its instance reference buttonContainer as set by Name.

<StackPanel Name="buttonContainer">
  <Button Click="RemoveThis">Click to remove this button</Button>
</StackPanel>
void RemoveThis(object sender, RoutedEventArgs e)
{
    FrameworkElement fe = e.Source as FrameworkElement;
    if (buttonContainer.Children.Contains(fe))
    {
        buttonContainer.Children.Remove(fe);
    }
}
 Private Sub RemoveThis(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
     Dim fe As FrameworkElement = e.Source
     If (buttonContainer.Children.Contains(fe)) Then
         buttonContainer.Children.Remove(fe)
     End If
End Sub

Как и в случае с переменными, имена экземпляров классов XAML регулируются понятием области, так что обеспечивается уникальность имен в пределах определенной области с известными границами.Just like a variable, the XAML name for an instance is governed by a concept of scope, so that names can be enforced to be unique within a certain scope that is predictable. Основная разметка, определяющая страницу, обозначает одну уникальную область видимости имен XAML с корневым элементом страницы в качестве границы.The primary markup that defines a page denotes one unique XAML namescope, with the XAML namescope boundary being the root element of that page. Однако другие источники разметки могут взаимодействовать со страницей во время выполнения, например стили или шаблоны в стилях, и такие источники разметки часто имеют свои собственные области видимости имен XAML, не обязательно связанные с областью видимости имен XAML страницы.However, other markup sources can interact with a page at run time, such as styles or templates within styles, and such markup sources often have their own XAML namescopes that do not necessarily connect with the XAML namescope of the page. Дополнительные сведения о x:Name и области видимости имен XAML, см. в разделе Name, директива x: Name, или области видимости имен XAML WPF.For more information on x:Name and XAML namescopes, see Name, x:Name Directive, or WPF XAML Namescopes.

Вложенные свойства и событияAttached properties and attached events

Одна из возможностей языка XAML позволяет задавать для любого элемента определенные свойства или события, независимо от того, существует ли свойство или событие в таблице определений типа для этого элемента.XAML specifies a language feature that enables certain properties or events to be specified on any element, regardless of whether the property or event exists in the type's definitions for the element it is being set on. Версия свойств этой возможности называется вложенным свойством, версия событий называется вложенным событием.The properties version of this feature is called an attached property, the events version is called an attached event. Концептуально можно представить вложенные свойства и события как глобальные члены, которые могут быть заданы для любого элемента/экземпляра объекта XAML.Conceptually, you can think of attached properties and attached events as global members that can be set on any XAML element/object instance. Впрочем, этот элемент/класс (или более крупная инфраструктура) должен поддерживать резервное хранилище свойств для вложенных значений.However, that element/class or a larger infrastructure must support a backing property store for the attached values.

Вложенные свойства в языке XAML обычно используются через синтаксис атрибутов.Attached properties in XAML are typically used through attribute syntax. В синтаксисе атрибутов можно указать вложенное свойство в виде тип_владельца.имя_свойства.In attribute syntax, you specify an attached property in the form ownerType.propertyName.

Внешне это напоминает использование элементов свойств, но в данном случае задаваемый тип ownerType всегда отличается от типа объектного элемента, для которого задается вложенное свойство.Superficially, this resembles a property element usage, but in this case the ownerType you specify is always a different type than the object element where the attached property is being set. ownerType является типом, предоставляющим методы доступа, необходимые обработчику XAML для получения или установки значения вложенного свойства.ownerType is the type that provides the accessor methods that are required by a XAML processor in order to get or set the attached property value.

Наиболее распространенным сценарием для вложенных свойств является разрешение дочерним элементам предоставления значения свойства их родительскому элементу.The most common scenario for attached properties is to enable child elements to report a property value to their parent element.

В следующем примере показано DockPanel.Dock вложенного свойства зависимостей.The following example illustrates the DockPanel.Dock attached property. DockPanel Класс определяет методы доступа для DockPanel.Dock и поэтому владеет вложенным свойством.The DockPanel class defines the accessors for DockPanel.Dock and therefore owns the attached property. DockPanel Класс также включает логику, которая выполняет итерацию его дочерних элементов и специально проверяет каждый элемент на набор значений DockPanel.Dock.The DockPanel class also includes logic that iterates its child elements and specifically checks each element for a set value of DockPanel.Dock. Если значение обнаруживается, это значение используется в процессе разметки для расположения дочерних элементов.If a value is found, that value is used during layout to position the child elements. Использование DockPanel.Dock присоединенного свойства и возможности размещения на самом деле является мотивирующим сценарием для DockPanel класса.Use of the DockPanel.Dock attached property and this positioning capability is in fact the motivating scenario for the DockPanel class.

<DockPanel>
  <Button DockPanel.Dock="Left" Width="100" Height="20">I am on the left</Button>
  <Button DockPanel.Dock="Right" Width="100" Height="20">I am on the right</Button>
</DockPanel>

В WPFWPF большинство вложенных свойств (или все такие свойства) также реализуются как свойства зависимости.In WPFWPF, most or all the attached properties are also implemented as dependency properties. Дополнительные сведения см. в разделе Общие сведения о вложенных свойствах зависимостей.For details, see Attached Properties Overview.

Вложенные события используют аналогичную форму тип_владельца.имя_события синтаксиса атрибутов.Attached events use a similar ownerType.eventName form of attribute syntax. Подобно невложенным событиям, значение атрибута для вложенного события в XAML задает имя метода обработчика, который вызывается, когда событие обрабатывается для элемента.Just like the non-attached events, the attribute value for an attached event in XAML specifies the name of the handler method that is invoked when the event is handled on the element. Использование вложенного события в XAML WPF менее распространено.Attached event usages in WPF XAML are less common. Дополнительные сведения см. в разделе Общие сведения о вложенных событиях.For more information, see Attached Events Overview.

Базовые типы и XAMLBase types and XAML

Базовая платформа XAML WPF и его пространство имен XAML представляют собой коллекцию типов, которые соответствуют объектам CLRCLR, а также элементы разметки для XAML.Underlying WPF XAML and its XAML namespace is a collection of types that correspond to CLRCLR objects in addition to markup elements for XAML. Однако не все классы могут сопоставляться с элементами.However, not all classes can be mapped to elements. Абстрактные классы, такие как ButtonBase, и некоторые неабстрактные базовые классы используются для наследования в CLRCLR модели объектов.Abstract classes, such as ButtonBase, and certain nonabstract base classes are used for inheritance in the CLRCLR objects model. Базовые классы, включая абстрактные, по-прежнему важны для разработки XAML, так как каждый из элементов XAML наследует члены некоторого базового класса в своей иерархии.Base classes, including abstract ones, are still important to XAML development because each of the concrete XAML elements inherits members from some base class in its hierarchy. Часто эти члены включают в себя свойства, которые можно задать в качестве атрибутов в элементе или событий, которые могут быть обработаны.Often these members include properties that can be set as attributes on the element, or events that can be handled. FrameworkElement — конкретный базовый ИПUI класс WPFWPF на уровне платформы WPF.FrameworkElement is the concrete base ИПUI class of WPFWPF at the WPF framework level. При проектировании ИПUI, будет использовать различные фигуры, панели, декоратор или классы элементов управления, в которой все являются производными от FrameworkElement.When designing ИПUI, you will use various shape, panel, decorator, or control classes, which all derive from FrameworkElement. Связанный базовый класс, FrameworkContentElement, поддерживает элементы, ориентированные на документы, которые работают для представления макета потока, используя API - интерфейсыAPIs , намеренно дублирующие API - интерфейсыAPIs в FrameworkElement.A related base class, FrameworkContentElement, supports document-oriented elements that work well for a flow layout presentation, using API - интерфейсыAPIs that deliberately mirror the API - интерфейсыAPIs in FrameworkElement. Сочетание атрибутов на уровне элементов и объектной модели CLRCLR обеспечивает набор общих свойств, которые можно задать для большинства конкретных элементов XAML, независимо от типа элемента XAML и его базового типа.The combination of attributes at the element level and a CLRCLR object model provides you with a set of common properties that are settable on most concrete XAML elements, regardless of the specific XAML element and its underlying type.

Безопасность XAMLXAML security

XAML — это язык разметки, непосредственно представляющий создание и выполнение объекта.XAML is a markup language that directly represents object instantiation and execution. Таким образом, элементы, созданные в XAML, имеют такие же возможности взаимодействия с системными ресурсами (например, сетевой доступ и операции ввода-вывода файловой системы), как и эквивалентный созданный код.Therefore, elements created in XAML have the same ability to interact with system resources (network access, file system IO, for example) as the equivalent generated code does.

WPFWPF поддерживает .NET Framework 4.NET Framework 4 платформы безопасности CAS (Code Access Security — безопасность доступа кода)Code Access Security (CAS). supports the .NET Framework 4.NET Framework 4 security framework CAS (Code Access Security — безопасность доступа кода)Code Access Security (CAS). Это означает, что содержимое WPFWPF, работающее в зоне Интернет, сократило разрешения исполнения.This means that WPFWPF content running in the internet zone has reduced execution permissions. "Свободный XAML" (страницы некомпилированного XAML, интерпретируемые во время загрузки средства просмотра XAML) и Приложение обозревателя XAML (XBAP)XAML browser application (XBAP) обычно выполняются в этой Интернет-зоне и используют один набор разрешений."Loose XAML" (pages of noncompiled XAML interpreted at load time by a XAML viewer) and Приложение обозревателя XAML (XBAP)XAML browser application (XBAP) are usually run in this internet zone and use the same permission set. Однако XAML, загруженный в полностью доверенное приложение, имеет такой же доступ к системным ресурсам, как ведущее приложение.However, XAML loaded in to a fully trusted application has the same access to the system resources as the hosting application does. Дополнительные сведения см. в разделе Безопасность частичного доверия в WPF.For more information, see WPF Partial Trust Security.

Загрузка XAML из кодаLoading XAML from code

XAML можно использовать для определения всего пользовательского интерфейса, но иногда также уместно определение в XAML только его части.XAML can be used to define all of the UI, but it is sometimes also appropriate to define just a piece of the UI in XAML. Эта возможность может использоваться для включения частичной настройки, локального хранения данных, использования XAML для предоставления бизнес-объекта или различных возможных сценариев.This capability could be used to enable partial customization, local storage of information, using XAML to provide a business object, or a variety of possible scenarios. Эти сценарии лежат XamlReader класса и его Load метод.The key to these scenarios is the XamlReader class and its Load method. Входные данные являются файлом XAML, а выходные данные — объектом, представляющим дерево объектов времени выполнения, созданных по разметке.The input is a XAML file, and the output is an object that represents all of the run-time tree of objects that was created from that markup. Затем можно вставить объект, который будет свойством другого объекта, уже существующего в приложении.You then can insert the object to be a property of another object that already exists in the application. Пока свойство является допустимым свойством в модели содержимого, которая имеет возможности отображения и которая уведомляет ядро выполнения о добавлении в приложение нового содержимого, можно достаточно легко изменить содержимое работающего приложения путем загрузки XAML.So long as the property is an appropriate property in the content model that has eventual display capabilities and that will notify the execution engine that new content has been added into the application, you can modify a running application's contents very easily by loading in XAML. Обратите внимание, что эта возможность доступна только в приложениях с уровнем полного доверия из-за очевидных с точки зрения безопасности последствий загрузки файлов в работающие приложения.Note that this capability is generally only available in full-trust applications, because of the obvious security implications of loading files into applications as they run.

Дальнейшие действияWhat's next

Этот раздел содержит основные сведения о терминологии и понятиях синтаксиса XAML применительно к WPF.This topic provides a basic introduction to XAML syntax concepts and terminology as it applies to WPF. Дополнительные сведения об используемых здесь терминах см. в разделе Подробное описание синтаксиса XAML.For more information about the terms used here, see XAML Syntax In Detail.

Если вы еще не сделали это, выполните упражнения из раздела руководства Пошаговое руководство: создание первого классического приложения WPF.If you have not already done this, try the exercises in the tutorial topic Walkthrough: My first WPF desktop application. При создании приложения, ориентированного на разметку и описанного в руководстве, упражнения помогут лучше осознать многие понятия, описанные в этом разделе.When you create the markup-centric application described by the tutorial, the exercise will help reinforce many of the concepts described in this topic.

WPFWPF использует конкретную модель приложения, основанный на Application класса. uses a particular application model that is based on the Application class. Дополнительные сведения см. в разделе Общие сведения об управлении приложением.For details, see Application Management Overview.

В разделе Построение приложения WPF представлены дополнительные сведения о том, как построить включающие XAML приложения из командной строки и в Microsoft Visual StudioMicrosoft Visual Studio.Building a WPF Application gives you more details about how to build XAML inclusive applications from the command line and with Microsoft Visual StudioMicrosoft Visual Studio.

В разделе Общие сведения о свойствах зависимостей представлены дополнительные сведения о разнообразии свойств WPFWPF и описано понятие свойств зависимостей.Dependency Properties Overview gives more information about the versatility of properties in WPFWPF, and introduces the concept of dependency properties.

См. такжеSee also

Подробное описание синтаксиса XAMLXAML Syntax In Detail
Код XAML и пользовательские классы для WPFXAML and Custom Classes for WPF
Возможности пространства имен языка XAML (x:)XAML Namespace (x:) Language Features
Расширения XAML WPFWPF XAML Extensions
Общие сведения о базовых элементахBase Elements Overview
Деревья в WPFTrees in WPF