Проблема родителя UserControl не в ChildWindow
, а в сетке внутри дочернего окна. Вам необходимо получить родительский элемент родительского элемента UserControl
, чтобы перейти к ChildWindow
: -
ChildWindow cw = (ChildWindow)((FrameworkElement)this.Parent).Parent;
Несмотря на то, что встраивание этого в ваш UserControl
будет плохой практикой, вы будете указывать потребителю вашего UserControl
, где его можно разместить. В приведенном выше случае, чтобы пользовательский элемент управления работал, он всегда должен быть прямым потомком корня макета.
Лучшим подходом было бы поискать в визуальном дереве, зацикливаясь на ChildWindow
. Я бы использовал этот вспомогательный метод (на самом деле я бы поместил его в статический класс вспомогательных расширений, но здесь все будет просто).
private IEnumerable<DependencyObject> Ancestors()
{
DependencyObject current = VisualTreeHelper.GetParent(this);
while (current != null)
{
yield return current;
current = VisualTreeHelper.GetParent(current);
}
}
Теперь вы можете использовать методы LINQ для получения ChildWindow с: -
ChildWindow cw = Ancestors().OfType<ChildWindow>().FirstOrDefault();
Это найдет первого предка вашего UserControl, который оказался ChildWindow. Это позволяет разместить UserControl на любой глубине в дочерних окнах XAML, он все равно найдет правильный объект.