2011-02-15 16 views
7

Ok, sé que FrameworkElement, que es una subclase directa de UIElement, tiene una propiedad Parent, pero paneles tienen hijos de tipo UIElement, no FrameworkElement (niños es de tipo UIElementCollection) que parece que significaría puede agregar UIElement s directamente a un Panel.¿Cómo puede obtener el padre de un UIElement?

Dicho esto, si tiene un UIElement y desea ver si tiene un elemento primario que sea un panel, la única manera que conozco de probarlo es con el VisualTreeHelper, pero ese es el árbol visual, no el árbol lógico. (Al menos sabemos que un Panel no tiene una plantilla así que tal vez ese sea el camino, pero aún así ...)

Así que además del VisualTreeHelper, ¿alguien sabe cómo saber qué panel es el padre de un UIElement? (... y tienen alguna idea de por qué no acaba de definir una propiedad Parent allí en vez de en FrameworkElement?)

Gracias!

Respuesta

6

Bueno, si necesita encontrar un padre lógico puede simplemente usar LogicalTreeHelper de la misma manera que VisualTreeHelper.

En cuanto a "... y tiene alguna idea de por qué no acaba de definir una propiedad Parent allí en vez de en FrameworkElement?". Básicamente, la noción de "Árbol lógico" se introduce en el nivel FrameworkElement. Consulte http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.aspx (consulte las Observaciones) para obtener detalles sobre qué FrameworkElement se agrega al UIElement. Esto es lo que dice acerca de los árboles lógicos:

El árbol lógico: El FPM modelo general de programación se expresa a menudo en términos de ser un árbol de elementos. Soporte para expresar el árbol de elementos como un árbol lógico, y que acompañan a la ayuda para definir que el árbol en el marcado se implemente en el nivel FrameworkElement. Tenga en cuenta sin embargo que FrameworkElement deliberadamente no define un modelo de contenido, y deja esa responsabilidad a derivados clases. Para obtener más información, consulte Trees in WPF.

+0

sé el diff. entre el árbol físico y el árbol lógico. Eso no es lo que pregunté. Tampoco puedo usar LogicalTreeHelper aquí ya que el lienzo puede ser parte del Visual Tree. Sin embargo, veo tu punto sobre el padre. Mi argumento allí sería ¿por qué no crear VisualParent por separado también entonces? Adivino a qué se reduce si no tengo más remedio que usar el VisualTreeHelper (y tal vez un método adjunto para mayor comodidad) para obtener el panel principal. Y aunque técnicamente no es la respuesta, lo estoy marcando como tal de todos modos porque no parece que exista. – MarqueIV

Cuestiones relacionadas