Общие сведения о расширениях разметки для XAMLMarkup Extensions for XAML Overview

Расширения разметки — это методика языка XAML для получения значения, которое не является ни примитивом, ни определенным типом XAML.Markup extensions are a XAML technique for obtaining a value that is neither a primitive nor a specific XAML type. Для использования атрибутов расширения разметки используют известную последовательность символов из открывающей фигурной скобки { для входа в область расширения разметки и закрывающей фигурной скобки } для выхода из нее.For attribute usage, markup extensions use the known character sequence of an opening curly brace { to enter the markup extension scope, and a closing curly brace } to exit. При использовании служб XAML .NET Framework можно применять некоторые предопределенные расширения разметки языка XAML из сборки System.Xaml.When using .NET Framework XAML Services, you can use some of the predefined XAML language markup extensions from the System.Xaml assembly. Можно также создать подкласс из класса MarkupExtension , определенного в System.Xaml, и определить собственные расширения разметки.You can also subclass from the MarkupExtension class, defined in System.Xaml, and define your own markup extensions. Или можно использовать расширения разметки, определенные конкретной платформой, если вы уже ссылаетесь на эту платформу.Or you can use markup extensions defined by a particular framework if you are already referencing that framework.

При обращении к расширению разметки средство записи объектов XAML может предоставить службы пользовательскому классу MarkupExtension точку подключения к службе в переопределении MarkupExtension.ProvideValue .When a markup extension usage is accessed, the XAML object writer can provide services to a custom MarkupExtension class through a service connection point in the MarkupExtension.ProvideValue override. Службы можно использовать для получения контекста использования, конкретных возможностей средства записи объектов, контекста схемы XAML и т. д.The services can be used to obtain context about the usage, specific capabilities of the object writer, XAML schema context, and so on.

Расширения разметки, определенные XAMLXAML-defined markup extensions

Несколько расширений разметки реализованы в службах XAML .NET Framework для поддержки языка XAML.Several markup extensions are implemented by .NET Framework XAML Services for XAML language support. Они соответствуют частям спецификации XAML как языка.These markup extensions correspond to parts of the specification of XAML as a language. Обычно они распознаются по префиксу x: в синтаксисе, как показано в общем использовании.These are typically identifiable by the x: prefix in the syntax as seen in common usage. .NET Framework реализации служб XAML для этих элементов языка XAML все являются производными от базового класса MarkupExtension.The .NET Framework XAML Services implementations for these XAML language elements all derive from the MarkupExtension base class.

Примечание

Префикс x: используется для обычного сопоставления пространства имен языка XAML в корневом элементе XAML.The x: prefix is used for the typical XAML namespace mapping of the XAML language namespace, in the root element of a XAML production. Например, проект и шаблоны страниц Visual Studio для различных конкретных платформ инициируют XAML-файл с помощью этого x: сопоставления.For example, the Visual Studio project and page templates for various specific frameworks initiate a XAML file using this x: mapping. Можно выбрать другой маркер префикса в собственном сопоставлении пространства имен XAML, но в этой документации по умолчанию предполагается сопоставление x: как средство идентификации этих сущностей, которые являются определенной частью пространства имен языка XAML, в отличие от пространства имен XAML по умолчанию конкретной платформы или других произвольных пространств имен CLR или XML.You could choose a different prefix token in your own XAML namespace mapping, but this documentation will assume the default x: mapping as a means of identifying those entities that are a defined part of the XAML language XAML namespace, as opposed to a specific framework's default XAML namespace or other arbitrary CLR or XML namespaces.

x:Typex:Type

x:Type предоставляет объект Type для именованного типа.x:Type supplies the Type object for the named type. Эта функция чаще всего используется в механизмах задержки, применяющих базовый тип CLR и наследование типов в качестве моникера группирования или идентификатора.This functionality is used most frequently in deferral mechanisms that use underlying CLR type and type derivation as a grouping moniker or identifier. Стили и шаблоны WPF и использование ими свойств TargetType — один из примеров.WPF styles and templates, and their usage of TargetType properties, are a specific example. Для получения дополнительной информации см. x:Type Markup Extension.For more information, see x:Type Markup Extension.

x:Staticx:Static

x:Static создает статические значения из сущностей кода типа значения, которые непосредственно не принадлежат к типу значения свойства, но могут быть приведены к нему.x:Static produces static values from value-type code entities that are not directly the type of a property's value, but can be evaluated to that type. Это полезно для указания значений, которые уже существуют в качестве известных констант в определении типа.This is useful for specifying values that already exist as well-known constants in a type definition. Для получения дополнительной информации см. x:Static Markup Extension.For more information, see x:Static Markup Extension.

x:Nullx:Null

x:Null указывает null как значение для элемента XAML.x:Null specifies null as a value for a XAML member. В зависимости от структуры определенных типов или от более масштабных понятий платформы null не всегда является значением свойства по умолчанию или неявным значением атрибута пустой строки.Depending on the design of specific types or on larger framework concepts, null is not always a default value for a property, or the implied value of an empty string attribute. Для получения дополнительной информации см. x:Null Markup Extension.For more information, see x:Null Markup Extension.

x:Arrayx:Array

x:Array поддерживает создание общих массивов в синтаксисе XAML, когда поддержка коллекций, предоставляемая базовыми элементами и моделями элементов управления, намеренно не используется.x:Array supports creation of general arrays in XAML syntax in cases where the collection support that is provided by base elements and control models is deliberately not used. Для получения дополнительной информации см. x:Array Markup Extension.For more information, see x:Array Markup Extension. В частности, в XAML 2009 доступ к массивам осуществляется как к языковым примитивы, а не как к расширению.In XAML 2009 specifically, arrays are accessed as language primitives instead of as an extension. Дополнительные сведения см. в разделе XAML 2009 Language Features.For more information, see XAML 2009 Language Features.

x:Referencex:Reference

x:Reference — это часть XAML 2009, расширение исходного набора языков (2006).x:Reference is part of XAML 2009, an extension of the original (2006) language set. x:Reference представляет ссылку на другой существующий объект в графе объектов.x:Reference represents a reference to another existing object in an object graph. Этот объект идентифицируется по x:Name.That object is identified by its x:Name. Дополнительные сведения см. в разделе x:Reference Markup Extension.For more information, see x:Reference Markup Extension.

Другие x: КонструкцииOther x: Constructs

Существуют другие конструкции x: для поддержки возможностей языка XAML, но они не реализованы как расширения разметки.Other x: constructs to support XAML language features exist, but these are not implemented as markup extensions. Дополнительные сведения см. в разделе пространство имен XAML (x:). Функцииязыка.For more information, see XAML Namespace (x:) Language Features.

Базовый класс MarkupExtensionThe MarkupExtension Base Class

Чтобы определить пользовательское расширение разметки, которое может взаимодействовать с реализациями средств чтения и записи XAML по умолчанию в System.Xaml, можно создать класс, производный от абстрактного класса MarkupExtension .To define a custom markup extension that can interact with the default implementations of XAML readers and XAML writers in System.Xaml, you derive a class from the abstract MarkupExtension class. У этого класса есть один метод для переопределения, ProvideValue.That class has one method to override, which is ProvideValue. Вам также необходимо определить дополнительные конструкторы для поддержки аргументов в расширениях разметки, соответствующие устанавливаемым свойствам.You might also need to define additional constructors to support arguments to the markup extension usage, and matching settable properties.

С помощью ProvideValueпользовательское расширение разметки получает доступ к контексту службы, который сообщает среде, где расширение разметки фактически вызывается обработчиком XAML.Through ProvideValue, a custom markup extension has access to a service context that reports the environment where the markup extension is actually invoked by a XAML processor. В пути загрузки это обычно XamlObjectWriter.In the load path this is typically a XamlObjectWriter. В пути сохранения это обычно XamlXmlWriter.In the save path this is typically a XamlXmlWriter. Контекст службы передается как внутренний класс контекста поставщика службы XAML, реализующий шаблон поставщика службы.Each report the service context as an internal XAML service provider context class that implements a service provider pattern. Дополнительные сведения о доступных службах и о том, что они представляют, см. в разделе Type Converters and Markup Extensions for XAML.For more information about the available services and what they represent, see Type Converters and Markup Extensions for XAML.

Класс расширения разметки должен использовать уровень общего доступа. Обработчики XAML всегда должны иметь возможность создать экземпляр класса поддержки расширения разметки для использования служб.Your markup extension class must use a public access level; XAML processors must always be able to instantiate the markup extension's support class in order to use its services.

Определение типа поддержки для пользовательского расширения разметкиDefining the Support Type for a Custom Markup Extension

При использовании служб XAML .NET Framework или платформ, основанных на службах XAML .NET Framework, у вас есть два варианта именования типов поддержки расширения разметки.When you use .NET Framework XAML Services or frameworks that build on .NET Framework XAML Services, you have two choices for how to name the markup extension support type. Имя типа соответствует тому, как средства записи объектов XAML пытаются получить доступ к типу поддержки расширения разметки и вызвать его при обнаружении использования расширения разметки в XAML.The type name is relevant to how XAML object writers attempt to access and invoke a markup extension support type when they encounter a markup extension usage in XAML. Используйте одну из следующих стратегий именования.Use one of the following naming strategies:

  • Имя типа должно точно соответствовать маркеру использования разметки XAML.Name the type name to be an exact match to the XAML markup usage token. Например, для поддержки использование расширения {Collate ...} , назовите тип поддержки Collate.For example, to support a {Collate ...} extension usage, name the support type Collate.
  • Имя типа должно состоять из маркера строки использования и суффикса Extension.Name the type name to be the usage string token plus the suffix Extension. Например, для поддержки использование расширения {Collate ...} , назовите тип поддержки CollateExtension.For example, to support a {Collate ...} extension usage, name the support type CollateExtension.

Порядок поиска следующий: выполняется поиск имени класса с суффиксом Extension, а затем имени класса без суффикса Extension .The order of lookup is to look for the Extension-suffixed class name first and then look for the class name without the Extension suffix.

С точки зрения использования разметки включение суффикса Extension как части использования допустимо.From the markup usage perspective, including the Extension suffix as part of the usage is valid. Тем не менее, это аналогично тому, что Extension действительно является частью имени класса, и средства записи объектов XAML не могут разрешить класс поддержки расширения разметки для такого использования, если класс поддержки не содержит суффикс Extension .However, this behaves as if Extension is truly part of the class name, and XAML object writers would fail to resolve a markup extension support class for that usage if the support class did not have the Extension suffix.

Конструктор без параметровThe parameterless constructor

Для всех типов поддержки расширения разметки необходимо предоставить открытый конструктор без параметров.For all markup extension support types, you should expose a public parameterless constructor. Конструктор без параметров необходим для любого случая, когда средство записи объектов XAML создает экземпляр расширения разметки на основе использования объектного элемента.A parameterless constructor is required for any case where a XAML object writer instantiates the markup extension from an object element usage. Поддержка использования элемента объекта — это адекватное предположение для расширения разметки, особенно для сериализации.Supporting object element usage is a fair expectation for a markup extension, particularly for serialization. Однако если планируется поддержка только использования атрибутов расширения разметки, можно реализовать расширение разметки без открытого конструктора.However, you can implement a markup extension without a public constructor if you only intend to support attribute usages of the markup extension.

Если использование расширения разметки не имеет аргументов, конструктор без параметров необходим для поддержки использования.If your markup extension usage has no arguments, the parameterless constructor is required to support usage.

Шаблоны конструктора и позиционные аргументы для пользовательского расширения разметкиConstructor Patterns and Positional Arguments for a Custom Markup Extension

Для расширения разметки с предполагаемым использованием аргументов открытые конструкторы должны соответствовать режимам предполагаемого использования.For a markup extension with intended argument usage, the public constructors must correspond to the modes of the intended usage. Другими словами, если расширение разметки предполагает один позиционный аргумент для допустимого использования, необходимо поддерживать открытый конструктор с одним входным параметром, который принимает позиционный аргумент.In other words, if your markup extension is designed to require one positional argument as a valid usage, you should support a public constructor with one input parameter that takes the positional argument.

Например, предположим, что расширение разметки Collate предназначено только для поддержки режима с одним позиционным аргументом, представляющий этот режим, который задан как константа перечисления CollationMode .For example, suppose the Collate markup extension is intended to support only a mode where there is one positional argument that represents its mode, specified as a CollationMode enumeration constant. В этом случае должен быть конструктор следующего вида:In this case, there should be a constructor with the following form:

public Collate(CollationMode collationMode) {...}

На базовом уровне аргументы, переданные расширению разметки — это строки, так как они перенаправляются из значений атрибутов разметки.At a basic level, the arguments passed to a markup extension are a string because they are being forwarded from the markup's attribute values. Можно сделать все аргументы строковыми и работать с входными данными на этом уровне.You can make all of your arguments strings and work with input at that level. Тем не менее, у вас есть доступ к определенной обработке, выполняемой до передачи аргументов расширения разметки классу поддержки.However, you do have access to certain processing that occurs before the markup extension arguments are passed to the support class.

Концептуально обработка выполняется так, будто расширение разметки объект — это объект, который должен быть создан, а затем задаются значения его членов.The processing works conceptually as if the markup extension is an object to be created, and then its member values are set. Каждое указанное свойство, которое необходимо установить, оценивается аналогично тому, как указанный элемент может быть задан для созданного объекта при анализе XAML.Each specified property to set is evaluated similar to how a specified member can be set on a created object when XAML is parsed. Однако имеется два важных отличия.There are two important differences:

  • Как отмечалось ранее, тип поддержки расширения разметки не обязательно должен иметь конструктор без параметров для создания экземпляра в XAML.As noted previously, a markup extension support type does not need to have a parameterless constructor in order to be instantiated in XAML. Создание соответствующего объекта откладывается, пока его возможные аргументы в текстовом синтаксисе не преобразуются в маркеры как позиционные или именованные аргументы, а в это время вызывается соответствующий конструктор.Its object construction is deferred until its possible arguments in the text syntax are tokenized and evaluated as either positional or named arguments, and the appropriate constructor is called at that time.
  • Использования расширения разметки могут быть вложенными.Markup extensions usages can be nested. Сначала вычисляется внутреннее расширение разметки.The innermost markup extension is evaluated first. Поэтому можно предположить такое использование и объявить один из параметров создания как тип, для создания которого требуется преобразователь значений (например, расширение разметки).Therefore, you can assume such a usage and declare one of the construction parameters to be a type that requires a value converter (such as a markup extension) to produce.

Использование такой обработки было показано в предыдущем примере.A reliance on such processing was shown in the previous example. Средство записи объектов XAML служб XAML .NET Framework преобразует имена констант перечисления в перечисленные значения на собственном уровне.The .NET Framework XAML Services XAML object writer processes enumeration constant names into enumerated values at a native level.

Обработка текстового синтаксиса позиционного параметра расширения разметки также может использовать преобразователь типов, связанный с типом в аргументе конструктора.Processing text syntax of a markup extension positional parameter can also rely on a type converter that is associated with the type that is in the construction argument.

Аргументы называются позиционными, поскольку порядок, в котором маркеры указываются в использовании, соответствует позиции параметра конструктора, которому они назначены.The arguments are called positional arguments because the order in which the tokens in the usage is encountered corresponds to the positional order of the constructor parameter to which they are assigned. Например, рассмотрим следующую сигнатуру конструктора:For example, consider the following constructor signature:

public Collate(CollationMode collationMode, object collateThis) {...}

Обработчик XAML ожидает два позиционных аргумента для данного расширения разметки.A XAML processor expects two positional arguments for this markup extension. Если применялось использование {Collate AlphaUp,{x:Reference circularFile}}, маркер AlphaUp отправляется в первый параметр и вычисляется как именованная константа перечисления CollationMode .If there was a usage {Collate AlphaUp,{x:Reference circularFile}}, the AlphaUp token is sent to the first parameter and evaluated as a CollationMode enumeration named constant. Результат внутреннего x:Reference передается во второй параметр и вычисляется как объект.The result of the inner x:Reference is sent to the second parameter and evaluated as an object.

В указанных правилах синтаксиса расширения разметки и обработки XAML запятая — это разделитель как позиционных, так и именованных аргументов.In the XAML specified rules for markup extension syntax and processing, the comma is the delimiter between arguments, whether those arguments are positional arguments or named arguments.

Повторяющаяся арность для аргументов с заданной позициейDuplicate arity of positional arguments

Если средство записи объектов XAML обнаруживает использование расширения разметки с позиционными аргументами и существует несколько аргументов конструктора, принимающих количество аргументов (дублирующая арность), это необязательно ошибка.If a XAML object writer encounters a markup extension usage with positional arguments, and there are multiple constructor arguments that take that number of arguments (a duplicate arity), that is not necessarily an error. Поведение зависит от настраиваемого параметра контекста схемы XAML, SupportMarkupExtensionsWithDuplicateArity.The behavior depends on a customizable XAML schema context setting, SupportMarkupExtensionsWithDuplicateArity. Если SupportMarkupExtensionsWithDuplicateAritytrue, средство записи объектов XAML не должно создавать исключения только из-за дублирующей арности.If SupportMarkupExtensionsWithDuplicateArity is true, a XAML object writer should not throw an exception only for reasons of duplicate arity. Последующее поведение строго не определено.Behavior beyond that point is not strictly defined. Базовое предположения проектирования состоит в том, что контекст схемы располагает информацией о типе отдельных параметров и может попытаться выполнить явные приведения, которые соответствуют дублированным кандидатам, чтобы увидеть, какая сигнатура оптимальная.The basic design assumption is that the schema context has type information available for the specific parameters and can attempt explicit casts that match the duplicate candidates to see which signature might be the best match. Исключение по-прежнему может быть вызвано, если никакие сигнатуры не могут передать тесты, используемые этим контекстом схемы, инициируемые средством записи объектов XAML.An exception might still be thrown if no signatures can pass the tests that are imposed by that particular schema context that is running on a XAML object writer.

По умолчанию SupportMarkupExtensionsWithDuplicateArityfalse в XamlSchemaContext на основе CLR для служб XAML .NET Framework.By default, SupportMarkupExtensionsWithDuplicateArity is false in the CLR-based XamlSchemaContext for .NET Framework XAML Services. Поэтому XamlObjectWriter по умолчанию создает исключения, если обнаруживает использование расширения разметки с дублирующей арностью в конструкторах резервного типа.Thus, the default XamlObjectWriter throws exceptions if it encounters a markup extension usage where there is duplicate arity in the backing type's constructors.

Именованные аргументы для пользовательского расширения разметкиNamed arguments for a custom markup extension

Расширения разметки, заданные XAML, также могут использовать форму именованных аргументов.Markup extensions as specified by XAML can also use a named arguments form for usage. На первом уровне разметки текстовый синтаксис делится на аргументы.At the first level of tokenization, the text syntax is divided into arguments. Наличие знака равенства (=) в каком-либо из аргументов определяет его как именованный.The presence of an equals sign (=) within any argument identifies an argument as a named argument. Такой аргумент также размечается в виде пары имени и значения.Such an argument is also tokenized into a name/value pair. Имя в этом случае определяет открытое устанавливаемое свойство типа поддержки расширения разметки.The name in this case names a public settable property of the markup extension's support type. Если планируется поддержка использования именованных аргументов, следует предоставить эти открытые устанавливаемые свойства.If you intend to support named argument usage, you should provide these public settable properties. Свойства могут быть наследуемыми, пока они открытые.The properties can be inherited properties as long as they remain public.

Доступ к контексту поставщика службы из реализации расширения разметкиAccessing Service Provider Context from a Markup Extension Implementation

Доступные службы одинаковы для всех преобразователей значений.The services available are the same for any value converter. Разница заключается в том, как преобразователь значения получает контекст службы.The difference is in how each value converter receives the service context. Доступ к службам и предоставляемые службы описаны в разделе Type Converters and Markup Extensions for XAML.Accessing services and the services available are documented in the topic Type Converters and Markup Extensions for XAML.

Использование элемента свойства для расширения разметкиProperty element usage of a markup extension

Сценарии использования расширения разметки часто разрабатываются на основе применения расширения разметки в использовании атрибутов.The scenarios for markup extension usages are often designed around using the markup extension in attribute usage. Однако также существует возможность определить резервный класс для поддержки использования элемента свойства.However, it is also potentially possible to define the backing class to support property element usage.

Для поддержки использования элемента свойства в расширении разметки Определите открытый конструктор без параметров.To support property element usage of your markup extension, define a public parameterless constructor. Это должен быть конструктор экземпляра, а не статический конструктор.This should be an instance constructor not a static constructor. Это необходимо, поскольку обработчик XAML должен обычно вызывать конструктор без параметров для любого элемента объекта, который он обрабатывает из разметки, а сюда входят классы расширения разметки как элементы объекта.This is required because a XAML processor must generally invoke the parameterless constructor on any object element it processes from markup, and this includes markup extension classes as object elements. Для более сложных сценариев можно определить нестандартные пути создания для классов.For advanced scenarios, you can define non-default construction paths for classes. (Дополнительные сведения см. в разделе Директива x:FactoryMethod.) Однако не следует использовать эти шаблоны для расширения разметки, так как это значительно усложняет обнаружение шаблонов использования для разработчиков и пользователей исходной разметки.(For more information, see x:FactoryMethod Directive.) However, you should not use these patterns for markup extension purposes because this makes discovery of the usage pattern much more difficult, both for designers and for users of raw markup.

Присвоение атрибутов пользовательскому расширению разметкиAttributing for a custom markup extension

Для поддержки сред разработки и определенных сценариев средства записи объектов XAML необходимо пометить тип поддержки расширения разметки несколькими атрибутами среды CLR.To support both design environments and certain XAML object writer scenarios, you should attribute a markup extension support type with several CLR attributes. Они сообщают предполагаемое использование расширения разметки.These attributes report the intended markup extension usage.

MarkupExtensionReturnTypeAttribute предоставляет информацию о Type для типа объекта, который возвращает ProvideValue .MarkupExtensionReturnTypeAttribute reports the Type information for the object type that ProvideValue returns. По чистой сигнатуре ProvideValue возвращает Object.By its pure signature, ProvideValue returns Object. Но различным пользователям может потребоваться более точная информация о типе возвращаемого значения.But various consumers might want more precise return type information. В том числе следующее:This includes:

  • Конструкторы и среды разработки, которые могут предоставлять поддержку с учетом типа для использования расширения разметки.Designers and IDEs, who might be able to provide type-aware support for markup extension usages.
  • Расширенные реализации обработчиков SetMarkupExtension в целевых классах, которые могут применять отражение для определения возвращаемого типа расширения разметки вместо ветвления на конкретных известных реализациях MarkupExtension по имени.Advanced implementations of SetMarkupExtension handlers on target classes, which might rely on reflection to determine a markup extension's return type instead of branching on specific known MarkupExtension implementations by name.

Сериализация использования расширения разметкиSerialization of markup extension usages

Когда средство записи объектов XAML обрабатывает использование расширения разметки и вызывает метод ProvideValue, контекст о том, что ранее оно было использованием расширения разметки, сохраняется в потоке узлов XAML, но не в графе объектов.When a XAML object writer processes a markup extension usage and calls ProvideValue, the context for it previously being a markup extension usage persists in the XAML node stream but not in the object graph. В графе объектов сохраняется только значение.In the object graph, only the value is preserved. Если существуют сценарии разработки или другие причины для сохранения исходного использования расширения разметки в сериализованных выходных данных, необходимо создать собственную инфраструктуру для отслеживания использования расширения разметки из потока узлов XAML пути загрузки.If you have design scenarios or other reasons for persisting the original markup extension usage into the serialized output, you must design your own infrastructure for tracking the markup extension usages from the load path XAML node stream. Можно реализовать поведение, чтобы воссоздать элементы потока узлов из пути загрузки и воспроизвести их в средствах записи XAML для сериализации в пути сохранения, заменив значение в соответствующей позиции потока узлов.You can implement behavior to recreate the elements of the node stream from the load path and play them back to XAML writers for serialization in the save path, substituting for the value in the appropriate position of the node stream.

Расширения разметки в потоке узлов XAMLMarkup extensions in the XAML node stream

При работе с потоком узлов XAML в пути загрузки использование расширения разметки отображается в потоке узлов как объект.If you are working with a XAML node stream on the load path, a markup extension usage appears in the node stream as an object.

Если использование расширения разметки применяет позиционные аргументы, оно представляется как начальный объект со значением инициализации.If the markup extension usage uses positional arguments, it is represented as a start object with an initialization value. В приблизительном текстовом представление поток узлов имеет следующий вид:As a rough text representation, the node stream resembles the following:

StartObject (XamlType — это тип определения расширения разметки, а не возвращаемый тип)StartObject (XamlType is the markup extension's definition type, not its return type)

StartMember (имя XamlMember_InitializationText)StartMember (name of the XamlMember is _InitializationText)

Value (значение — это позиционные аргументы в виде строки, включая используемые разделители)Value (value is the positional arguments as a string including the intervening delimiters)

EndMember

EndObject

Использование расширения разметки с именованными аргументами представлено в качестве объекта с членами с соответствующими именами, для каждого из которых заданы значения в виде текстовых строк.A markup extension usage with named arguments is represented as an object with members of the relevant names, each set with text string values.

Фактически для вызова реализации ProvideValue расширения разметки требуется контекст схемы XAML, так как для этого необходимо сопоставление типов и создание экземпляра типа поддержки расширения разметки.Actually invoking the ProvideValue implementation of a markup extension requires the XAML schema context because that requires type-mapping and creating a markup extension support type instance. Это одна из причин того, почему использования расширения разметки сохраняются таким образом в потоках узлов служб XAML .NET Framework по умолчанию — часть чтения пути загрузки часто не обладает необходимым контекстом схемы XAML.This is one reason why markup extension usages are preserved this way in the default .NET Framework XAML Services node streams - the reader part of a load path often does not have the necessary XAML schema context available.

При работе с потоком узлов XAML в пути сохранении, как правило, ничего не в представлении графа объектов нет ничего, что могло бы сообщить, что сериализуемый объект был изначально предоставлен использованием расширения разметки и результатом ProvideValue .If you are working with a XAML node stream on the save path, there generally is nothing present in an object graph representation that can inform you that the object to serialize was originally provided by a markup extension usage and a ProvideValue result. В сценариях, требующих сохранения использования расширения разметки для циклической обработки и сохранении других изменений графа объектов, необходимо создать собственные методы сохранения информации об использовании расширения разметки из исходных входных данных XAML.Scenarios that need to persist markup extension usages for round-tripping while also capturing other changes in the object graph must devise their own techniques for preserving the knowledge of a markup extension usage from the original XAML input. Например, чтобы восстановить использования расширения разметки, может потребоваться поработать с потоком узлов в пути сохранении для восстановления использований расширения разметки или выполнить своего рода слияние исходного XAML и XAML обхода.For example, to restore the markup extension usages, you may need to work with the node stream on the save path in order to restore markup extension usages, or perform some type of merge between the original XAML and the round-tripped XAML. Некоторые платформы c реализацией XAML , например WPF, используют промежуточные типы (выражения) для представления случаев, где использования расширения разметки передают значения.Some XAML-implementing frameworks such as WPF use intermediate types (expressions) to help represent cases where markup extension usages provided the values.

См. такжеSee also