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


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

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

Необходимые условия

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

Какие сведения передаются метаданными свойств Framework

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

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

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

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

    Заметка

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

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

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

Чтение метаданных FrameworkPropertyMe

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

Указание метаданных

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

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

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

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

  2. Используйте одну из подписей без параметра flags, а затем задайте для каждого логического свойства отчетов значение FrameworkPropertyMetadatatrue для каждого требуемого изменения характеристик. При этом необходимо задать эти свойства до создания любых элементов с этим свойством зависимости; логические свойства являются записываемыми, что позволяет избежать использования параметра flags и все равно заполнять метаданные, но метаданные должны быть эффективно закрыты для изменений перед использованием свойств. Таким образом, попытка задать свойства после запроса метаданных будет недопустимой операцией.

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

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

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

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

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

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

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

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

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

См. также