Essayez de faire de cette manière pour trouver le parent.
public static T TryFindParent<T>(this DependencyObject child)
where T : DependencyObject
{
//get parent item
DependencyObject parentObject = GetParentObject(child);
//we've reached the end of the tree
if (parentObject == null) return null;
//check if the parent matches the type we're looking for
T parent = parentObject as T;
if (parent != null)
{
return parent;
}
else
{
//use recursion to proceed with next level
return TryFindParent<T>(parentObject);
}
}
Celui-ci trouvera l'objet parent.
public static DependencyObject GetParentObject(this DependencyObject child)
{
if (child == null) return null;
//handle content elements separately
ContentElement contentElement = child as ContentElement;
if (contentElement != null)
{
DependencyObject parent = ContentOperations.GetParent(contentElement);
if (parent != null) return parent;
FrameworkContentElement fce = contentElement as FrameworkContentElement;
return fce != null ? fce.Parent : null;
}
//also try searching for parent in framework elements (such as DockPanel, etc)
FrameworkElement frameworkElement = child as FrameworkElement;
if (frameworkElement != null)
{
DependencyObject parent = frameworkElement.Parent;
if (parent != null) return parent;
}
//if it's not a ContentElement/FrameworkElement, rely on VisualTreeHelper
return VisualTreeHelper.GetParent(child);
}
Cet extrait fonctionne avec des objets de dépendance arbitraires de type Visual ou Visual3D. Alors disons que vous avez besoin d'une référence à la fenêtre qui héberge un ce quelque part contrôle Button donné, tout ce que vous avez besoin est:
Button myButton = ...
Window parentWindow = UIHelper.TryFindParent<Window>(myButton);
La méthode TryFindParent ci-dessus permet également facile d'obtenir un élément à une position donnée. La méthode ci-dessous effectue un test de réussite basé sur une position donnée. Si le test de validation ne renvoie pas l'élément demandé (par exemple, un CheckBox cliqué sur un arbre, alors que vous êtes intéressé par le TreeViewItem qui héberge le CheckBox), la procédure délègue la recherche à TryFindParent.
Cela est très pratique pour les événements liés à la souris si vous avez juste besoin maintenant ce qui est sous le pointeur de la souris:
public static T TryFindFromPoint<T>(UIElement reference, Point point)
where T:DependencyObject
{
DependencyObject element = reference.InputHitTest(point)
as DependencyObject;
if (element == null) return null;
else if (element is T) return (T)element;
else return TryFindParent<T>(element);
}
Reference
Bien que ce lien peut répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. –
@NathanTuggy Oui, vous avez raison. Je ne suis pas sûr que cela a aidé le PO mais je publie tout de même le contenu du lien ici. Merci pour les mains levées. –