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

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

Важно!

Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.

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

Для понимания статьи нужно иметь базовые знания о свойствах зависимостей и прочитать Общие сведения о свойствах зависимостей. Чтобы понимать примеры в этой статье полезно познакомиться с языком XAML и узнать, как создавать приложения WPF.

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

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

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

  • Метаданные, влияющие на макет родительского элемента элемента, в частности AffectsParentArrange флаги метаданных.AffectsParentMeasure Примеры свойств зависимостей WPF, которые задают эти флаги, и FixedPage.LeftParagraph.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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примечание.

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

См. также