Основываясь на этом ответе и ответах, представленных здесь (и благодаря комментарию Wouter), я наконец-то пришел к следующему:
using System.Windows.Media;
using System.Windows.Media.Media3D;
public static class FamilyHelper
{
public static T FindAncestor<T>(this DependencyObject dObj) where T : DependencyObject
{
while (true)
{
if (dObj == null) return null;
var parent = VisualTreeHelper.GetParent(dObj as Visual ?? new UIElement())
?? VisualTreeHelper.GetParent(dObj as Visual3D ?? new UIElement())
?? LogicalTreeHelper.GetParent(dObj);
if (parent is T) return (T) parentT;
dObj = parent;
}
}
}
, который никогда не ошибается и работаетдля всех типов органов управления, например
var element = sender as UIElement;
var parentWindow = element.FindAncestor<Window>();