2010-12-09 18 views
12

Je souhaite supprimer un objet FrameworkElement de l'arborescence visuelle. Étant donné que le FrameworkElement possède une propriété Parent, il serait évident de résoudre ce problème en le retirant de là:Suppression d'un élément de l'arborescence visuelle de manière générique

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

Le problème est que la propriété Parent de FrameworkElement est de DependencyObject, qui n'a aucune notion d'enfants. La seule chose que je peux voir aller à ce problème est par la coulée du parent pour voir si elle est une bordure, panneaux, etc. (éléments qui ont notion d'enfants) et l'enlever de là:

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; 
    } 
} 

ce n'est évidemment pas une solution très flexible et pas générique du tout. Quelqu'un peut-il suggérer une approche plus générique pour supprimer un élément de l'arbre visuel?

Répondre

6

Je ne pense pas qu'il existe un moyen plus simple. En fait, il ne peut y avoir de moyen générique de le faire. WPF est très flexible et vous pouvez créer un contrôle personnalisé avec un modèle qui prend 3 enfants à afficher dans 3 endroits différents avec des modèles personnalisés.

Ce que vous pouvez faire de mieux est de prendre en compte toutes les commandes de base et de les inclure dans votre échelle if-else. Ce sont Panel, Border, ContentControl, ItemsControl, etc.

+0

Dommage qu'il n'y ait pas d'interfaces générales pour les articles avec des enfants. Merci pour la liste, je n'ai pas pensé à ContentControl ou ItemsControl ... pour le moment ça va faire! –

+3

@Gergely: Je suis tombé sur un article sur MSDN à propos du modèle de contenu dans WPF. Je pense que cela pourrait vous être utile. http://msdn.microsoft.com/library/bb613548.aspx – decyclone