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


Метаданные свойств Framework (WPF .NET)

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

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

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

Категории метаданных свойств Framework

FrameworkPropertyMetadata входят в следующие категории:

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

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

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

    Заметка

    Термин "наследует" в контексте значений свойств специфичен для свойств зависимостей и не имеет прямого отношения к управляемым типам кода и наследованию членов путём производных типов. В контексте свойств зависимостей это означает, что дочерние элементы могут наследовать значения свойств зависимостей от родительских элементов.

  • Метаданные привязки данных, в частности, флаги BindsTwoWayByDefault и IsNotDataBindable метаданных. По умолчанию свойства зависимостей в платформе WPF поддерживают односторонняя привязка. Рассмотрите возможность настройки двусторонней привязки в качестве значения по умолчанию для свойств, которые состояния отчета и изменяются действием пользователя, например IsSelected. Кроме того, рассмотрите возможность двусторонней привязки в качестве значения по умолчанию, когда пользователи элемента управления ожидают, что свойство будет реализовано, например TextBox.Text. BindsTwoWayByDefault влияет только на режим привязки по умолчанию. Чтобы изменить направление потока данных привязки, задайте Binding.Mode. Вы можете использовать IsNotDataBindable, чтобы отключить привязку данных, если для нее нет вариантов использования. Дополнительные сведения о привязках данных см. в обзоре привязки данных.

  • Журналирование метаданных, в частности метаданных флаг Journal. Значение по умолчанию флага Journal равно только true для некоторых свойств зависимостей, таких как SelectedIndex. Элементы управления входными данными пользователей должны задать флаг Journal для свойств, значения которых содержат выбор пользователей, которые должны храниться. Флаг Journal считывается приложениями или службами, поддерживающими ведение журнала, включая службы журнала WPF. См. обзор навигациидля получения информации о хранении шагов навигации.

FrameworkPropertyMetadata является производным непосредственно от UIPropertyMetadataи реализует флаги, рассмотренные здесь. Если только не задано, FrameworkPropertyMetadata флаги имеют значение по умолчанию false.

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

Чтобы получить метаданные для свойства зависимости, вызовите GetMetadata на идентификаторе DependencyProperty. Вызов GetMetadata возвращает объект PropertyMetadata. Если вам нужно преобразовать значения метаданных платформы, приведите PropertyMetadata к FrameworkPropertyMetadata.

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

При регистрации свойства зависимостей можно создать и назначить метаданные ему. Объект метаданных, который вы назначаете, может быть PropertyMetadata или одним из производных классов, например FrameworkPropertyMetadata. Выберите FrameworkPropertyMetadata для свойств зависимостей, использующих API презентации WPF и исполняемые файлы для отрисовки и привязки данных. Более продвинутым вариантом является создание пользовательского класса отчета метаданных на основе FrameworkPropertyMetadata с большим количеством флагов. Кроме того, вы можете использовать UIPropertyMetadata для свойств, отличных от платформы, влияющих на отрисовку пользовательского интерфейса.

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

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

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

  2. Создайте экземпляр FrameworkPropertyMetadata с помощью конструктора, который не имеет параметра FrameworkPropertyMetadataOptions, а затем установите соответствующие флаги Boolean на FrameworkPropertyMetadata. Задайте значения флага перед связыванием экземпляра FrameworkPropertyMetadata со свойством зависимостей, в противном случае вы получите InvalidOperationException.

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

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

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

  • Для DefaultValueновое значение заменит существующее значение по умолчанию. Если вы не указываете DefaultValue в переопределении метаданных и если установлен флаг Inherits для существующего FrameworkPropertyMetadata, то значение по умолчанию берётся от ближайшего предка, который указал DefaultValue в метаданных.

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

  • Для ненаследуемых флагов FrameworkPropertyMetadata можно переопределить значение по умолчанию false, заменив его на значение true. Однако можно переопределить только значение true со значением false для Inherits, Journal, OverridesInheritanceBehaviorи SubPropertiesDoNotAffectRender.

Заметка

Логика слияния по умолчанию реализуется методом Merge. Вы можете указать пользовательскую логику слияния в производном классе, наследующем свойство зависимости, переопределив Merge в этом классе.

См. также