Метаданные свойств среды
Параметры метаданных свойств среды сообщаются для свойств элементов объектов, которые, как считается, в архитектуре Windows Presentation Foundation (WPF) находятся на уровне среды WPF. В целом привязка к уровню среды WPF подразумевает, что такие функции, как отрисовка, привязка данных и уточнение системных свойств, обрабатываются в презентации WPF API и исполняемых файлах. Метаданные свойств среды запрашиваются этими системами для определения функциональных характеристик конкретных свойств элемента.
Предварительные требования
Предполагается, что вы имеете представление о свойствах зависимостей с точки зрения потребителя существующих свойств зависимостей в классах Windows Presentation Foundation (WPF) и ознакомились с разделом Общие сведения о свойствах зависимостей. Вам следует также ознакомиться с разделом Метаданные свойства зависимости.
Передаваемые сведения в метаданных свойств среды
Метаданные свойств среды можно разделить на следующие категории.
Передающие свойства макета, влияющие на элемент (AffectsArrange, AffectsMeasure, AffectsRender). Может задать эти флаги в метаданных, если свойство влияет на соответствующие аспекты, а также реализации MeasureOverride / ArrangeOverride методы в классе для предоставления поведение визуализации и сведения в макет система. Как правило, такая реализация проверяет аннулирование свойств в свойствах зависимости, где любое из этих свойств макета имело в метаданных свойств значение true, и только для таких аннулирований необходимо запросить новый проход макета.
Передающие свойства макета, влияющие на родительский элемент элемента (AffectsParentArrange, AffectsParentMeasure). Некоторые примеры, где эти флаги установлены по умолчанию: FixedPage.Left и Paragraph.KeepWithNext.
Inherits. По умолчанию свойства зависимости не наследуют значения. OverridesInheritanceBehavior позволяет перемещать путь наследования в визуальное дерево, которое необходимо для некоторых сценариев управления.
Note
Термин "наследует" в контексте значений свойств имеет особое значение для свойств зависимостей; это означает, что дочерние элементы могут наследовать фактическое значение свойства зависимости от родительских элементов (это обусловлено возможностью системы свойств WPF на уровне среды WPF). Это не имеет ничего общего непосредственно с типом управляемого кода и наследованием элементов через производные типы. Подробнее см. в разделе Наследование значения свойства.
Передающие характеристики привязки данных (IsNotDataBindable, BindsTwoWayByDefault). По умолчанию свойства зависимости в среде поддерживают привязку данных с односторонним поведением привязки. Привязку данных можно было бы отключить, если бы сценарий для нее отсутствовал в принципе (поскольку они должны быть гибкими и расширяемыми, однако примеров таких свойств в WPF API по умолчанию не много). Можно задать привязку для получения двусторонней привязки по умолчанию для свойств, объединяющих поведения элемента управления среди их составляющих (IsSubmenuOpen приведен пример) или если двусторонняя привязка является распространенным и ожидаемым сценарием для пользователей (Text является примером). Изменение метаданных, связанных с привязкой данных, влияет только на значение по умолчанию; на уровне отдельных привязок это значение по умолчанию всегда можно изменить. Сведения о режимах связывания и связывании в целом см. в разделе Общие сведения о связывании данных.
Отчеты, должны ли свойства приложения или службы, поддерживающие ведение журнала (Journal). Для общих элементов ведение журнала не включено по умолчанию, но оно выборочно включается для некоторых пользовательских элементов управления вводом. Это свойство предназначено для прочтения службами ведения журнала, включая реализацию WPF ведения журнала, и обычно устанавливается для пользовательских элементов управления, таких как пользовательский выбор в списках, который необходимо сохранять на протяжении нескольких шагов навигации. Сведения о журнале см. в разделе Общие сведения о навигации.
Чтение FrameworkPropertyMetadata
Каждое из свойств ссылки выше являются специальными свойствами, FrameworkPropertyMetadata добавляет в свой непосредственный базовый класс UIPropertyMetadata. Каждое из этих свойств будет иметь значение false
по умолчанию. Запрос метаданных для свойства, где важно знать значение этих свойств следует попытаться привести возвращаемые метаданные к FrameworkPropertyMetadata, а затем при необходимости проверить значения отдельных свойств.
Задание метаданных
Создавая новый экземпляр метаданных в целях применения метаданных к новой регистрации свойства зависимостей, вы можете выбрать класс метаданных для использования: базовый PropertyMetadata или некоторые производного класса, такие как FrameworkPropertyMetadata. В общем случае следует использовать FrameworkPropertyMetadata, особенно в том случае, если свойство имеет любое взаимодействие с системой свойств и WPF функции, такие как макет и привязка данных. Другой вариант в более сложных сценариях является наследование от FrameworkPropertyMetadata для создания собственных метаданных класс, с дополнительными сведениями отчетов они передаются в его члены. Или можно использовать PropertyMetadata или UIPropertyMetadata для передачи степени поддержки функций вашей реализации.
Для существующих свойств (AddOwner или OverrideMetadata вызова), необходимо всегда выполнять переопределение с типом метаданных, использованным исходной регистрацией.
Если вы создаете FrameworkPropertyMetadata экземпляра, существует два способа заполнения метаданных значениями для определенных свойств, передающих характеристики свойств среды:
Используйте FrameworkPropertyMetadata сигнатура конструктора, который позволяет
flags
параметра. Этот параметр должен быть заполнен всеми нужными комбинированных значений из FrameworkPropertyMetadataOptions флаги перечисления.Используйте одну из подписей без
flags
параметра, а затем настройте каждое логическое свойство отчетности на FrameworkPropertyMetadata дляtrue
для каждого требуемого изменения характеристики. Если сделать это, необходимо настроить эти свойства до создания каких-либо элементов с этим свойством зависимости. Логические свойства доступны для чтения и записи, чтобы разрешить поведение, которое избегает параметра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и могут переопределяться в производных классах метаданных.