Как в Silverlight устанавливается свойство Parent для FrameworkElement?

Я написал собственный элемент управления Silverlight на основе Control. У меня есть два DependencyProperties с именами Top и Bottom, которые содержат дочерние элементы управления для определенного отображения макета. Затем я использую ControlTemplate, чтобы объединить эти два элемента управления в сетку, разместив один в строке 0, а другой - в строке 1. Проблема в том, что я не могу понять, как заставить свойство Parent каждого дочернего элемента управления указывать на мой настраиваемый элемент управления. Когда я проверяю каждый элемент управления во время выполнения, свойство Parent каждого из них имеет значение NULL.

Это простой пример, но я думаю, вы понимаете общую проблему. У меня есть несколько более сложных элементов управления, которые разделяют эту проблему. Я знаю, что мне не хватает какой-то магии. Если для свойства ContentControl установлено значение некоторого дочернего элемента, оно каким-то образом устанавливает самого себя в качестве родителя этого дочернего элемента.

Изменить: дополнительная информация.

В WPF для управления отношениями родитель / потомок можно использовать такие функции, как AddVisualChild (), RemoveVisualChild (), AddLogicalChild (), RemoveLogicChild (), но эти функции недоступны в Silverlight.


person Jason Jackson    schedule 05.02.2009    source источник


Ответы (2)


После небольшого исследования я считаю, что это невозможно. Мне удалось выполнить рекурсию через визуальное дерево вместо логического дерева, используя VisualTreeHelper для достижения моей конечной цели.

person Jason Jackson    schedule 10.02.2009
comment
Правильный. Родитель устанавливается самой платформой представления при создании визуального дерева. - person Jeff Wilcox; 30.08.2009
comment
Я чувствую себя немного глупо, отмечая свой ответ как правильный, но по прошествии некоторого времени я не нашел лучшего ответа. - person Jason Jackson; 31.08.2009

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

Из MSDN: Parent может быть пустой ссылкой (Nothing в Visual Basic) в случаях, когда элемент был создан, но не прикреплен к какому-либо логическому дереву, которое в конечном итоге подключается к корневому элементу уровня страницы или объекту приложения.

...

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

person BC.    schedule 05.02.2009
comment
Правильно. Итак, когда вы пишете настраиваемый элемент управления, как вы реплицируете происходящее, устанавливая свойство Content или добавляя элемент в качестве дочернего элемента в коллекцию Children? - person Jason Jackson; 05.02.2009