FrameworkElement.Parent и VisualtreeHelper.GetParent ведут себя по-разному.

В приложении WP7 я рекурсивно использовал FrameworkElement.Parent, чтобы определить, находится ли конкретный элемент внутри другого элемента. Но не всегда работает корректно. Затем я изменил свой код, чтобы рекурсивно использовать метод VisualtreeHelper.GetParent, и он всегда работает правильно (насколько я тестировал).

Так чем же они отличаются?

Спасибо


person Cui Pengfei 崔鹏飞    schedule 03.08.2011    source источник


Ответы (2)


Рассмотрим ControlA и ControlB, где ControlA — это элемент управления содержимым, что означает, что он может содержать другие элементы управления.

<ControlA>
   <ControlB />
</ControlA>

Логически свойство Parent экземпляра ControlB в данном случае является экземпляром ControlA.

Однако, если вы посмотрите на Template сеттер стиля ControlA по умолчанию, вы можете найти сложный Xaml, содержащий некоторое управление визуальным состоянием и иерархию границ и сеток, и, наконец, похороненный в этой партии, есть ContentPresenter, где будет размещен дочерний элемент управления.

Рекурсивный цикл VisualTreeHelper.Parent найдет каждый элемент, определенный в шаблоне, от ContentPresenter до "логического" родительского элемента и далее.

person AnthonyWJones    schedule 03.08.2011
comment
означает, что VisualTreeHelper.GetParent возвращает родителя визуального дерева, а FrameworkElement.Parent возвращает родителя логического дерева? - person Cui Pengfei 崔鹏飞; 03.08.2011

Значение, сообщаемое свойством FrameworkElement.Parent в Silverlight, обычно является тем же значением, которое было бы сообщено с помощью API VisualTreeHelper, поскольку две концепции дерева часто синхронизируются в отношении того, как сообщаются отношения родитель-потомок. Однако могут быть случаи, когда FrameworkElement.Parent сообщает о родительском элементе, а VisualTreeHelper — нет.

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.parent(v=VS.95).aspx

person trydis    schedule 03.08.2011
comment
Я прочитал документ, но он не объясняет, когда и почему они ведут себя по-разному. - person Cui Pengfei 崔鹏飞; 03.08.2011
comment
Я вижу именно это. VisualTreeHelper.GetParent дает значение null, в то время как FrameworkElement.Parent не равно null. Но это на WinRT. - person bitdisaster; 27.08.2015