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


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

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

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

  • Предварительные требования
  • Передаваемые сведения в метаданных свойств среды
  • Чтение FrameworkPropertyMetadata
  • Задание Метаданных
  • Поведение слияния метаданных свойств среды
  • Связанные разделы

Предварительные требования

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

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

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

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

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

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

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

    Термин «наследует» в контексте значений свойств имеет особое значение для свойств зависимости; это означает, что дочерние элементы могут наследовать текущее значение свойства зависимости от родительских элементов из-за возможностей системы свойств WPF на уровне среды WPF.Он ничего не делает непосредственно с типом управляемого кода и наследованием членов при помощи производных типов.Дополнительные сведения см. в разделе Наследование значения свойства.

  • Передающие характеристики привязки данных (IsNotDataBindable, BindsTwoWayByDefault). По умолчанию свойства зависимости в среде поддерживают привязку данных с поведением односторонней привязки. Можно отключить привязку данных, если для нее не существует каких-либо скриптов (поскольку они предназначены для гибкости и расширяемости, существует лишь небольшое количество примеров таких свойств в WPF APIs по умолчанию). Можно установить привязку для получения двусторонней привязки по умолчанию для свойств, связывающих вместе модели поведения элемента управления среди его компонентных составляющих (например, 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 и может быть переопределено в производных классах метаданных.

См. также

Ссылки

GetMetadata

Основные понятия

Метаданные свойства зависимости

Общие сведения о свойствах зависимости

Пользовательские свойства зависимостей