Метаданные свойств среды

Параметры метаданных свойств Платформы передаются для свойств элементов объекта, которые считаются на уровне платформы WPF в архитектуре Windows Presentation Foundation (WPF). Как правило, назначение на уровне платформы WPF подразумевает, что такие функции, как отрисовка, привязка данных и уточнения системы свойств, обрабатываются API презентации WPF и исполняемыми файлами. Метаданные свойств среды запрашиваются этими системами для определения функциональных характеристик конкретных свойств элемента.

Необходимые компоненты

Предполагается, что вы имеете представление о свойствах зависимостей с точки зрения потребителя существующих свойств зависимостей в классах Windows Presentation Foundation WPF и ознакомились с разделом Общие сведения о свойствах зависимостей. Вам следует также ознакомиться с разделом Метаданные свойства зависимости.

Передаваемые сведения в метаданных свойств среды

Метаданные свойств среды можно разделить на следующие категории.

  • Свойства макета отчетов, влияющие на элемент (AffectsArrange, AffectsMeasure, AffectsRender). Можно задать эти флаги в метаданных, если свойство влияет на соответствующие аспекты и вы также реализуете методы MeasureOverride / ArrangeOverride в своем классе, чтобы предоставить то или иное поведение отрисовки и сведения системе компоновки. Как правило, такая реализация проверяет аннулирование свойств в свойствах зависимости, где любое из этих свойств макета имело в метаданных свойств значение true, и только для таких аннулирований необходимо запросить новый проход макета.

  • Свойства макета отчетов, влияющие на родительский элемент элемента (AffectsParentArrange, AffectsParentMeasure). Примерами случаев, когда эти флаги задаются по умолчанию являются FixedPage.Left и Paragraph.KeepWithNext.

  • Inherits. По умолчанию свойства зависимости не наследуют значения. OverridesInheritanceBehavior позволяет также передавать пути наследования в визуальное дерево, которое необходимо для некоторых сценариев компоновки элементов управления.

    Примечание.

    Термин "наследует" в контексте значений свойств имеет особое значение для свойств зависимостей; это означает, что дочерние элементы могут наследовать фактическое значение свойства зависимости от родительских элементов (это обусловлено возможностями системы свойств WPF на уровне самой платформы WPF). Это не имеет ничего общего непосредственно с типом управляемого кода и наследованием элементов через производные типы. Подробнее см. в разделе Наследование значения свойства.

  • Характеристики привязки данных отчетов (IsNotDataBindable, BindsTwoWayByDefault). По умолчанию свойства зависимости в среде поддерживают привязку данных с односторонним поведением привязки. Привязку данных можно было бы отключить, если бы сценарий для нее отсутствовал в принципе (поскольку они должны быть гибкими и расширяемыми, однако примеров таких свойств в API-интерфейсах WPF по умолчанию не много). Можно настроить двустороннюю привязку по умолчанию для свойств, объединяющих поведения элемента управления среди их составляющих (IsSubmenuOpen — один из примеров) или если двусторонняя привязка является распространенным и ожидаемым сценарием для пользователей (например, Text). Изменение метаданных, связанных с привязкой данных, влияет только на значение по умолчанию; на уровне отдельных привязок это значение по умолчанию всегда можно изменить. Сведения о режимах связывания и связывании в целом см. в разделе Общие сведения о связывании данных.

  • Передающее значение, которое указывает, должны ли приложения или службы, поддерживающие ведение журнала (Journal), вносить в журнал свойства. Для общих элементов ведение журнала не включено по умолчанию, но оно выборочно включается для некоторых пользовательских элементов управления вводом. Это свойство предназначено для прочтения службами ведения журнала, включая реализацию WPF ведения журнала, и обычно устанавливается для пользовательских элементов управления, таких как пользовательский выбор в списках, который необходимо сохранять на протяжении нескольких шагов навигации. Сведения о журнале см. в разделе Общие сведения о навигации.

Чтение FrameworkPropertyMetadata

Каждое из свойств, для которых приведены ссылки выше, являются особыми свойствами, которые FrameworkPropertyMetadata добавляет в свой непосредственный базовый класс UIPropertyMetadata. Каждое из этих свойств будет иметь значение false по умолчанию. Запрос метаданных для свойства, когда важно знать значение этих свойств, должен попытаться привести возвращаемые метаданные к FrameworkPropertyMetadata, а затем при необходимости проверить значения отдельных свойств.

Задание метаданных

Когда вы создаете новый экземпляр метаданных в целях применения метаданных к новой регистрации свойства зависимостей, необходимо выбрать класс метаданных для использования: базовый PropertyMetadata или какой-либо производный класс, например FrameworkPropertyMetadata. Как правило, следует использовать функциональные возможности FrameworkPropertyMetadata, особенно если свойство имеет какое-либо взаимодействие с системой свойств и функциями WPF, такими как макет и привязка данных. Другой вариант для более сложных сценариев заключается в наследовании от FrameworkPropertyMetadata с целью создания собственного класса отчетности метаданных с сохранением дополнительной информации в его участниках. Или же нужно использовать PropertyMetadata или UIPropertyMetadata для предоставления информации о степени поддержки для реализованных функций.

Для существующих свойств (AddOwner или вызов OverrideMetadata) всегда нужно выполнять переопределение с помощью типа метаданных, который используется исходной регистрацией.

При создании экземпляра FrameworkPropertyMetadata существует два способа заполнения метаданных значениями для определенных свойств, передающих характеристики свойств среды:

  1. Используйте сигнатуру конструктора FrameworkPropertyMetadata, которая допускает параметр flags. Этот параметр нужно заполнять всеми необходимыми комбинированными значениями флагов перечисления FrameworkPropertyMetadataOptions.

  2. Используйте одну из сигнатур без параметра flags а затем настройте каждое логическое свойство отчетности в FrameworkPropertyMetadata равным true для каждого необходимого изменения характеристики. Если сделать это, необходимо настроить эти свойства до создания каких-либо элементов с этим свойством зависимости. Логические свойства доступны для чтения и записи, чтобы разрешить поведение, которое избегает параметра flags и все равно заполняет метаданные, однако метаданные необходимо эффективно паковать, прежде чем использовать свойство. Таким образом, попытка задать свойства после запроса метаданных будет недопустимой операцией.

Поведение слияния метаданных свойств среды

При переопределении метаданных свойств среды различные характеристики метаданных объединяются или заменяют друг друга.

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

  • Фактическое поведение системы свойств для PropertyChangedCallback заключается в следующем: реализации для всех владельцев метаданных в иерархии сохраняются и добавляются в таблицы в определенном порядке выполнения системой свойств, при этом обратные вызовы наиболее глубоких производных классов вызываются первыми. Наследуемые обратные вызовы выполняются только один раз и считается, что они принадлежат классу, разместившему их в метаданных.

  • DefaultValue заменяется. Если не указать PropertyChangedCallback в переопределении, значение DefaultValue берется из ближайшего родительского элемента, задававшего его в метаданных.

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

  • Поведение системы свойств заключается в том, что вызывается только метод обратного вызова CoerceValueCallback в непосредственных метаданных. Никакие ссылки на другие реализации CoerceValueCallback в иерархии не сохраняются.

  • Флаги перечисления FrameworkPropertyMetadataOptions комбинируются с применением побитовой операции ИЛИ. При задании FrameworkPropertyMetadataOptions исходные параметры не перезаписываются. Чтобы изменить какой-либо параметр, нужно задать соответствующее свойство FrameworkPropertyMetadata. Например, если исходный объект FrameworkPropertyMetadata задает флаг FrameworkPropertyMetadataOptions.NotDataBindable, его можно изменить, задав для FrameworkPropertyMetadata.IsNotDataBindable значение false.

Это поведение реализуется Merge и может быть перезаписано в производных классах метаданных.

См. также