FrameworkElement.Parent и VisualtreeHelper.GetParent ведут себя по-разному - PullRequest
3 голосов
/ 03 августа 2011

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

Так в чем их отличие?

Спасибо

Ответы [ 2 ]

4 голосов
/ 03 августа 2011

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

<ControlA>
   <ControlB />
</ControlA>

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

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

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

1 голос
/ 03 августа 2011

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

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

...