2010-12-09 12 views
12

Me gustaría eliminar un FrameworkElement del árbol visual. Desde el FrameworkElement tiene una propiedad Parent, sería obvio para resolver este problema mediante la eliminación de allí:Eliminar un elemento del árbol visual de forma genérica

FrameworkElement childElement; 
if(childElement != null && childElement.Parent != null) // In the visual tree 
{ 
    // This line will, of course not complie: 
    // childElement.Parent.RemoveFromChildren(childElement); 
} 

El problema es que la propiedad Parent de FrameworkElement es de DependencyObject, que no tiene noción de los niños. Así que la única cosa que puedo veo que pasa por este problema es a través de la fundición de Padres para ver si se trata de una frontera, etc (elementos que no tienen noción de los niños) del panel y sacarlo de allí:

FrameworkElement childElement; 
if(childElement != null && childElement.Parent != null) // In the visual tree 
{ 
    if(childElement.Parent is Panel) 
    { 
    (childElement.Parent as Panel).Children.Remove(childElement); 
    } 
    if(childElement.Parent is Border) 
    { 
    (childElement.Parent as Border).Child = null; 
    } 
} 

Obviamente, esto no es una solución muy flexible y no genérica en absoluto. ¿Puede alguien sugerir un enfoque más genérico para eliminar un elemento del árbol visual?

Respuesta

6

No creo que haya una manera más simple. En realidad, no puede haber una manera genérica fácil de hacer eso. WPF es muy flexible y puede crear un control personalizado con una plantilla que lleve a 3 niños a mostrar en 3 lugares diferentes con plantillas personalizadas.

Lo que puedes hacer mejor es tener en cuenta todos los controles básicos e incluirlos en tu escalera if-else. Estos son Panel, Border, ContentControl, ItemsControl, etc.

+0

Es una pena que no haya interfaces generales para elementos con niños. Gracias por la lista, no he pensado en ContentControl o ItemsControl ... ¡por ahora esto servirá! –

+3

@Gergely: me encontré con un artículo en MSDN sobre el modelo de contenido en WPF. Pensé que esto podría ser útil para ti. http://msdn.microsoft.com/library/bb613548.aspx – decyclone

Cuestiones relacionadas