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


Определение настраиваемых типов для использования со службами XAML .NET

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

Шаблоны конструкторов и определения типов для XAML

Чтобы создать экземпляр в виде элемента объекта в XAML, пользовательский класс должен соответствовать следующим требованиям:

  • Пользовательский класс должен быть открытым и должен предоставлять открытый конструктор без параметров. (См. следующий раздел для примечаний о структурах.)

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

Вы по-прежнему можете указать значения объектов для типов, которые не соответствуют этим критериям, если включить преобразователь значений. Дополнительные сведения см. в разделе Преобразователи типов и расширения разметки для XAML.

Структуры

Структуры всегда могут создаваться в XAML с помощью определения СРЕДЫ CLR. Это связано с тем, что компилятор CLR неявно создает конструктор без параметров для структуры. Этот конструктор инициализирует все значения свойств по умолчанию.

В некоторых случаях поведение построения по умолчанию для структуры нежелательно. Это может быть связано с тем, что структура предназначена для заполнения значений и функций концептуально в качестве объединения. Как объединение, содержащиеся значения могут иметь взаимоисключающие интерпретации, и, следовательно, ни одно из его свойств не задано. Пример такой структуры в словаре WPF — GridLength. Такие структуры должны реализовать преобразователь типов, чтобы значения можно было выразить в форме атрибута, используя строковые соглашения, которые создают различные интерпретации или режимы значений структуры. Структура также должна предоставлять аналогичное поведение для построения кода с помощью конструктора без параметров.

Интерфейсы

Интерфейсы можно использовать в качестве базовых типов элементов. Система типов XAML проверяет назначаемый список и ожидает, что объект, предоставленный в качестве значения, можно назначить интерфейсу. Нет понятия о том, как интерфейс должен быть представлен как тип XAML, если соответствующий назначаемый тип поддерживает требования к построению XAML.

Методы фабрики

Методы фабрики — это функция XAML 2009. Они изменяют принцип XAML, который объекты должны иметь конструкторы без параметров. Методы фабрики не описаны в этой статье. См. директивы x:FactoryMethod.

Перечисления

Перечисления имеют поведение преобразования собственного типа XAML. Имена констант перечисления, указанные в XAML, разрешаются в соответствии с базовым типом перечисления и возвращают значение перечисления в модуль записи объектов XAML.

XAML поддерживает использование флагов для перечислений с применением FlagsAttribute. Дополнительные сведения см. в синтаксисе XAML в подробной. (синтаксис XAML подробно написан для аудитории WPF, но большая часть информации в этом разделе относится к XAML, которая не относится к определенной платформе реализации.)

Определения элементов

Типы могут определять элементы для использования XAML. Для типов можно определить элементы, которые доступны для использования XAML, даже если этот конкретный тип не подходит для использования XAML. Это возможно из-за наследования среды CLR. Если некоторый тип, наследующий член, поддерживает использование XAML в качестве типа, и член поддерживает использование XAML для своего базового типа или имеет собственный синтаксис XAML, доступный для использования в XAML.

Свойства

Если вы определяете свойства как общедоступное свойство CLR с помощью типичных get среды CLR и set шаблонов доступа и ключевых слов, подходящих для языка, система типов XAML может сообщать об этом свойстве как член с соответствующими сведениями, предоставленными для свойств XamlMember, таких как IsReadPublic и IsWritePublic.

Определенные свойства могут включать текстовый синтаксис, применяя TypeConverterAttribute. Дополнительные сведения см. в разделе Преобразователи типов и расширения разметки для XAML.

В отсутствие текстового синтаксиса или собственного преобразования XAML и при отсутствии дальнейшего косвенного обращения, например использования расширения разметки, тип свойства (TargetType в системе типов XAML) должен иметь возможность возвращать экземпляр в модуль записи объектов XAML, обрабатывая целевой тип как тип CLR.

При использовании XAML 2009 расширения разметки x:Reference Markup можно использовать для предоставления значений, если предыдущие рекомендации не выполнены; однако это больше проблемы с использованием, чем проблема определения типа.

События

Если вы определяете события как общедоступное событие СРЕДЫ CLR, система типов XAML может сообщать о событии как член с IsEvent как true. Подключение обработчиков событий не входит в область возможностей служб XAML .NET; Проводка остается для конкретных платформ и реализаций.

Методика

Встроенный код для методов не является возможностью XAML по умолчанию. В большинстве случаев вы не ссылаетесь непосредственно на члены метода из XAML, а роль методов в XAML заключается только в том, чтобы обеспечить поддержку определенных шаблонов XAML. директива x:FactoryMethod является исключением.

Поля

Рекомендации по проектированию среды CLR препятствуют нестатическим полям. Для статических полей можно получить доступ к значениям статических полей только через x:Static Markup Extension; В этом случае вы не делаете ничего особенного в определении среды CLR для предоставления поля для использования x:Static.

Присоединенные элементы

Присоединенные члены предоставляются XAML через шаблон метода доступа для определяющего типа. Определяемый тип не должен использоваться в формате XAML в качестве объекта. На самом деле, распространенный шаблон заключается в объявлении класса службы, роль которого заключается в том, чтобы принадлежать присоединенный член и реализовать связанные поведения, но не служат ни для каких других функций, таких как представление пользовательского интерфейса. В следующих разделах заполнитель PropertyName представляет имя присоединенного члена. Это имя должно быть допустимым в грамматике XamlName.

Будьте осторожны с конфликтами имен между этими шаблонами и другими методами типа. Если элемент существует, соответствующий одному из шаблонов, его можно интерпретировать как пути использования присоединенных элементов обработчиком XAML, даже если это не было вашим намерением.

Метод доступа GetPropertyName

Подпись для метода доступа GetPropertyName должна быть следующей:

public static object GetPropertyName(object target)

  • Объект target можно указать как более конкретный тип в реализации. Это можно использовать для области использования присоединенного члена; использование за пределами предполагаемой области приведет к возникновению недопустимых исключений приведения, которые затем отображаются ошибкой синтаксического анализа XAML. Имя параметра target не является обязательным, но называется target по соглашению в большинстве реализаций.

  • Возвращаемое значение можно указать в качестве более конкретного типа в реализации.

Чтобы поддерживать синтаксис текста с поддержкой TypeConverter для использования атрибутов присоединенного члена, примените TypeConverterAttribute к методу доступа GetPropertyName. Применение к get вместо set может показаться неинтуитивным; Однако это соглашение может поддерживать концепцию присоединенных только для чтения элементов, которые являются сериализуемыми, что полезно в сценариях конструктора.

Метод доступа SetPropertyName

Подпись для метода доступа SetPropertyName должна быть следующей:

public static void SetPropertyName(object target, object value)

  • Объект target можно указать в качестве более конкретного типа в реализации с той же логикой и последствиями, как описано в предыдущем разделе.

  • Объект value можно указать как более конкретный тип в реализации.

Помните, что значение этого метода — это входные данные, поступающие из использования XAML, обычно в форме атрибута. Из формы атрибутов должна быть поддержка преобразователя значений для текстового синтаксиса, а также атрибут для метода доступа GetPropertyName.

Присоединенные хранилища элементов

Методы доступа обычно недостаточно, чтобы предоставить средства для размещения присоединенных значений элементов в граф объектов или извлечения значений из графа объектов и их сериализации должным образом. Чтобы обеспечить эту функциональность, объекты target в предыдущих сигнатурах доступа должны быть способны хранить значения. Механизм хранения должен соответствовать принципу присоединенного члена, который член может быть присоединен к целевым объектам, в которых присоединенный член не находится в списке элементов. Службы XAML .NET предоставляют метод реализации для присоединенных хранилищ элементов через API IAttachedPropertyStore и AttachablePropertyServices. IAttachedPropertyStore используется средствами записи XAML для обнаружения реализации хранилища и должен быть реализован в типе, который является target методов доступа. Статические AttachablePropertyServices API используются в тексте методов доступа и ссылаются на присоединенный элемент AttachableMemberIdentifier.

Правильное указание типов, членов и сборок важно для отправки сведений о системных данных XAML службам XAML. Если применяются следующие ситуации, сведения о системе типов XAML относятся к отчетам:

  • Вы планируете использовать типы для использования с системами XAML, которые непосредственно основаны на средствах чтения XAML служб .NET и записи XAML.
  • Вы определяете или используете платформу, использующую XAML, которая основана на этих средствах чтения XAML и записи XAML.

Список каждого атрибута, связанного с XAML, который относится к поддержке XAML пользовательских типов, см. в разделе XAML-Related Атрибуты CLR для пользовательских типов и библиотек.

Употребление

Использование пользовательских типов требует, чтобы автор разметки сопоставлял префикс для сборки и пространства имен CLR, содержащего настраиваемый тип. Эта процедура не описана в этом разделе.

Уровень доступа

XAML предоставляет средства для загрузки и создания экземпляров типов с уровнем доступа internal. Эта возможность предоставляется таким образом, чтобы пользовательский код смог определить собственные типы, а затем создать экземпляры этих классов из разметки, которая также входит в ту же область пользовательского кода.

Примером из WPF является каждый раз, когда пользовательский код определяет UserControl, предназначенный для рефакторинга поведения пользовательского интерфейса, но не как часть любого возможного механизма расширения, который может быть подразумеваем, объявляя вспомогательный класс с уровнем доступа public. Такой UserControl можно объявить с помощью internal доступа, если резервный код компилируется в ту же сборку, из которой ссылается тип XAML.

Для приложения, загружающего XAML в соответствии с полным доверием и использующего XamlObjectWriter, всегда включена загрузка классов с уровнем доступа internal.

Для приложения, загружающего XAML под частичным доверием, можно управлять характеристиками уровня доступа с помощью API XamlAccessLevel. Кроме того, механизмы отсрочки (например, система шаблонов WPF) должны иметь возможность распространять все разрешения на уровне доступа и сохранять их для соответствующих вычислений времени выполнения; это обрабатывается внутренне путем передачи сведений XamlAccessLevel.

Реализация WPF

В XAML WPF используется модель доступа с частичным доверием, где при загрузке BAML под частичным доверием доступ ограничен AssemblyAccessTo для сборки, которая является источником BAML. Для отсрочки WPF использует IXamlObjectWriterFactory.GetParentSettings в качестве механизма передачи сведений о уровне доступа.

В терминологии XAML WPF внутренний тип — это тип, определенный той же сборкой, которая также включает ссылающийся XAML. Такой тип можно сопоставить с пространством имен XAML, которое намеренно исключает часть сопоставления, например xmlns:local="clr-namespace:WPFApplication1". Если BAML ссылается на внутренний тип и этот тип имеет уровень доступа internal, это создает класс GeneratedInternalTypeHelper для сборки. Если вы хотите избежать GeneratedInternalTypeHelper, необходимо использовать уровень доступа public или учитывать соответствующий класс в отдельную сборку и сделать эту сборку зависимой.

См. также