Подход, который работает для всех типов, состоит в том, чтобы пройтись по логическому дереву, пока не найдете требуемый узел типа:
Window baseWindow = FindLogicalParent<Window>(this);
Этот метод не существует в фреймворке, поэтому вот реализация:
internal static T FindLogicalParent<T>(DependencyObject obj)
where T : DependencyObject
{
DependencyObject parent = obj;
while (parent != null)
{
T correctlyTyped = parent as T;
if (correctlyTyped != null)
return correctlyTyped;
parent = LogicalTreeHelper.GetParent(parent);
}
return null;
}
Для Window
, в частности, вы можете использовать:
Window.GetWindow(this);