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


Преобразователи типов или расширения разметки для XAML

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

В этом разделе содержатся следующие подразделы.

  • Преобразователи значений
  • Преобразователи типов
  • Расширения разметки
  • Сериализаторы значений
  • Другие преобразователи значений
  • Преобразователи типов и расширения разметки в сочетании
  • Контекст служб для преобразователя значений
  • Связанные разделы

Преобразователи значений

В XAML преобразователи значений используются в различных целях. Ниже перечислены различные типы преобразователей значений в XAML.

  • Преобразователь типов

  • Расширение разметки

  • Сериализатор значений

  • Связанный класс или класс поддержки, предоставляющий логику для тестового синтаксиса XAML.

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

В определении служб XAML платформы .NET Framework преобразователи типов являются классами, производным от класса среды CLR TypeConverter. TypeConverter — это класс, который присутствовал в Microsoft .NET Framework и до появления XAML. Его первоначальным назначением являлась поддержка окон свойств и аналогичных метафор текстового редактирования для свойств IDE. Применение XAML в платформе .NET Framework предполагает использование класса TypeConverter для преобразования текстового синтаксиса (обнаруженного в значении атрибута или в узле значения XAML) в объект. TypeConverter также может использоваться для сериализации значения объекта в текстовый синтаксис. Класс TypeConverter также использовался и в предыдущих реализациях XAML для отдельных платформ Windows Presentation Foundation (WPF) и Windows Communication Foundation (WCF). Дополнительные сведения о классе TypeConverter в XAML см. в разделе Общие сведения о преобразователях типов для XAML.

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

В реализации служб XAML платформы .NET Framework расширения разметки являются классами, производными от класса MarkupExtension. Расширения разметки — это понятие, которое в этой форме создается языком XAML. Расширение разметки можно считать чем-то подобным расширяемой escape-последовательности, вызывающей класс службы для обеспечения своей логики. С точки зрения разметки обработчики XAML всегда распознают расширение разметки по текстовой последовательности, которая начинается с открывающей фигурной скобки ({) в текстовой строке.

Расширения разметки отличаются от преобразователей типов. Преобразователи типов обычно связаны с типами или членами. Они вызываются, когда при сериализации или создании графа объектов обнаруживается текстовый синтаксис, связанный с этими сущностями.

Расширения разметки связаны с отдельным классом службы поддержки, однако могут быть применены к любому значению члена. (Однако расширение разметки можно реализовать таким образом, чтобы намеренно ограничить его использование определенными членами или конечными типами при помощи контекста службы.) Расширения разметки могут переопределять ассоциации преобразователей типов. Их также можно использовать для указания значения атрибута для членов, которые в противном случае не смогли бы поддерживать текстовый синтаксис.

Дополнительные сведения о способе реализации расширения разметки для XAML см. в разделе Общие сведения о расширениях разметки для XAML.

ПримечаниеПримечание

Оба типа, MarkupExtension и ValueSerializer, находятся в пространстве имен System.Windows.Markup, а не в пространстве имен System.Xaml.Это не означает, что эти типы являются специфичными либо для WPF, либо для технологий Windows Forms, которые в противном случае заполняют пространства имен CLR, содержащие строку Windows.MarkupExtension и ValueSerializer находятся в сборке System.Xaml и не обладают зависимостями от конкретных платформ.Эти типы существовали в пространстве имен среды CLR для .NET Framework 3.0 и остаются в пространстве имен среды CLR в .NET Framework 4 во избежание нарушения ссылок в существующих проектах WPF.Дополнительные сведения см. в разделе Типы, перенесенные из WPF в System.Xaml.

Сериализаторы значений

ValueSerializer является специализированным преобразователем типов, оптимизированным для преобразования объекта в строку. ValueSerializer для XAML может вообще не реализовать метод ConvertFrom. Реализация ValueSerializer получает службы подобно реализации TypeConverter. Виртуальные методы предоставляют входной параметр context. Параметр context относится к типу IValueSerializerContext, который наследуется из интерфейса IServiceProvider и обладает методом GetService.

В системе типов XAML и для реализаций средств записи XAML, предполагающих циклическую обработку узлов XAML для сериализации, о преобразователе значений, связанном с типом или членом, сообщается с помощью его собственного свойства XamlType.ValueSerializer. Для средств записи XAML, выполняющих сериализацию, это значит, что если существует и XamlType.TypeConverter, и XamlType.ValueSerializer, для пути загрузки необходимо использовать преобразователь типов, а для пути сохранения — сериализатор значений. Если существует XamlType.TypeConverter, но значение XamlType.ValueSerializer равно null, преобразователь типов используется также для пути сохранения.

Другие преобразователи значений

Преобразователь значений может расшириться за границы конкретных шаблонов преобразователя типа или расширения разметки. Но для такой настройки также потребуется переопределение системы типов XAML, предоставляемое службами XAML платформы .NET Framework. Существующая система типов XAML содержит представления и системы отчетности для преобразователей типов, расширений разметки и сериализаторов значений, но не для пользовательских форм преобразования значений. Если требуется создать пользовательские преобразователи значений, необходимо использовать тип XamlValueConverter<TConverterBase>.

Преобразователи типов и расширения разметки в сочетании

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

Контекст служб для преобразователя значений

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

См. также

Ссылки

MarkupExtension

XamlObjectWriter

Другие ресурсы

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

Общие сведения о преобразователях типов для XAML

Служебные контексты, доступные для расширений разметки и преобразователей типов