Как точно Приложенные Свойства работают в WPF?

POD обозначает Простые Данные - то есть, класс (определенный ли с ключевым словом struct или ключевым словом class) без конструкторов, деструкторы и виртуальные участники функционируют. статья Википедии о POD вдается в немного большее количество подробностей и определяет его как:

А Простая Структура данных в C++ является совокупным классом, который содержит только ПЕРЕХОДНЫЕ ПРИСТАВКИ как участников, не имеет никакого пользовательского деструктора, никакого пользовательского оператора присваивания копии и никаких нестатических членов указателя на тип элемента.

Большая деталь может быть найдена в этот ответ для C++ 98/03 . C++ 11 изменил правила окружающий POD, ослабив их значительно, таким образом потребность последующего ответа здесь .

23
задан Mark Carpenter 23 July 2009 в 18:30
поделиться

3 ответа

Здесь есть два понятия: свойства зависимости и присоединенные свойства зависимости . «Прикрепленные свойства» - это свойства зависимости и, как таковые, поддерживают наследование значений свойств зависимостей .

Что касается основных свойств зависимостей, очень грубым утверждением будет то, что они в основном наследуют свои значения от родительских элементов в wpf ( логическое / визуальное) дерево. Свойство зависимости (присоединенное или нет) наследует свое значение «вниз», если его метаданные установлены с помощью флага FrameworkPropertyMetadataOptions . Inherit , и во многих случаях это итак.

Присоединенные свойства - это свойства, которые могут быть установлены для любого объекта wpf (в основном, как минимум DependencyObject) с помощью метода DependencyObject.SetValue . Целью этого механизма является «прикрепление» к другим объектам информации, необходимой родительским объектам, а не самим дочерним объектам. Например, Grid.Row - это присоединенное свойство, необходимое сетке для размещения элементов в пределах своей области рендеринга.

Свойства зависимостей автоматически наследуются "вниз" объектной системой wpf.

Прикреплено. свойства исследуются "вверх" явно, в коде конкретных объектов. В случае Grid, после определения, где разместить свои элементы, он проверяет значение присоединенных свойств Grid.Row и Grid.Column для каждого содержащегося элемента.

Также часто используется метод создания настраиваемых прикрепленных свойств, которые каким-то образом изменяют объекты, к которым они прикреплены (например, Drag'n'Drop функциональность через прикрепленные свойства ).

В качестве дополнительного примечания, хорошим примером наследования присоединенного свойства является TextElement.FontFamily . Для свойств Grid.Row и Grid.Column не установлен флаг Inherits.

TextElement.FontFamily, из Reflector:

 FontFamilyProperty = DependencyProperty.RegisterAttached("FontFamily", typeof(FontFamily), typeof(TextElement), new FrameworkPropertyMetadata(SystemFonts.MessageFontFamily, FrameworkPropertyMetadataOptions.Inherits | FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure), new ValidateValueCallback(TextElement.IsValidFontFamily));

Grid.Row, из Reflector:

 RowProperty = DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(Grid.OnCellAttachedPropertyChanged)), new ValidateValueCallback(Grid.IsIntValueNotNegative));
42
ответ дан 29 November 2019 в 01:49
поделиться

Простыми словами я это понимаю так (пожалуйста, поправьте меня, если я ошибаюсь).

Объект (A) реализует свойство, которое будет прикреплено к другому объекту (B) (объект B даже не знает о существовании этого «присоединяемого» свойства). Объект B должен быть унаследован от DependencyObject.

Объект A также реализует статический метод для проверки его «присоединяемого» свойства в других объектах, A.GetAttachedProperty (B).

Если B имеет присоединенное свойство из A, A.GetAttachedProperty прочитает и вернет его значение. В противном случае A попытается прочитать его и вернет null, поскольку его там нет.

0
ответ дан 29 November 2019 в 01:49
поделиться

Из MSDN :

Хотя присоединенные свойства можно установить для любого объекта, это не означает автоматически, что установка свойства приведет к ощутимому результату или что значение когда-либо будет использоваться другим объектом. Как правило, присоединенные свойства предназначены для того, чтобы каждый объект, происходящий из множества возможных иерархий классов или логических отношений, мог сообщать общую информацию типу, который определяет присоединенное свойство. Тип, определяющий присоединенное свойство, обычно следует одной из следующих моделей:

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

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

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

Пример прикрепленного свойства, определяемого родителем

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

DockPanel определяет присоединенное свойство DockPanel.Dock, а DockPanel имеет код уровня класса как часть своей логики визуализации (в частности, MeasureOverride и ArrangeOverride). Экземпляр DockPanel всегда будет проверять, установил ли какой-либо из его непосредственных дочерних элементов значение для DockPanel.Dock. Если это так, эти значения становятся входными для логики визуализации, применяемой к этому конкретному дочернему элементу. Каждый вложенный экземпляр DockPanel обрабатывает свои собственные коллекции непосредственных дочерних элементов, но это поведение зависит от реализации того, как DockPanel обрабатывает значения DockPanel.Dock. Теоретически возможно иметь присоединенные свойства, которые влияют на элементы за пределами непосредственного родителя. Если присоединенное свойство DockPanel.Dock установлено для элемента, у которого нет родительского элемента DockPanel, который мог бы воздействовать на него, ошибка или исключение не возникает. Это просто означает, что было установлено значение глобального свойства, но у него нет текущего родительского элемента DockPanel, который мог бы потреблять информацию.

3
ответ дан 29 November 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: