Ответ 1
Вы пробовали
Window yourParentWindow = Window.GetWindow(userControl1);
Я пытаюсь получить доступ к родительскому окну из пользовательского элемента управления.
userControl1 uc1 = new userControl1();
mainGrid.Children.Add(uc1);
через этот код я загружаю userControl1
в основную сетку.
Но когда я нажимаю кнопку внутри userControl1
, то я хочу загрузить еще один userControl2
в mainGrid
, который находится в главном окне?
Вы пробовали
Window yourParentWindow = Window.GetWindow(userControl1);
Это получает окно корневого уровня:
Window parentWindow = Application.Current.MainWindow
или прямое родительское окно
Window parentWindow = Window.GetWindow(this);
Спасибо, что помогли мне, ребята. я получил другое решение
((this.Parent) as Window).Content = new userControl2();
это отлично работает
Сделайте статический экземпляр главного окна, вы можете просто вызвать его в своем пользовательском элементе управления:
См. этот пример:
Window1.cs
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
_Window1 = this;
}
public static Window1 _Window1 = new Window1();
}
UserControl1.CS
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
private void AddControl()
{
Window1._Window1.MainGrid.Children.Add(usercontrol2)
}
}
Единственная причина, по которой предложенный
Window yourParentWindow = Window.GetWindow(userControl1);
не работает для вас, потому что вы не применили его к правильному типу:
var win = Window.GetWindow(this) as MyCustomWindowType;
if (win != null) {
win.DoMyCustomWhatEver()
} else {
ReportError("Tough luck, this control works only in descendants of MyCustomWindowType");
}
Если не должно быть, тем больше связей между вашим типом окон и вашим контролем, я считаю ваш подход плохим дизайном.
Я бы предложил передать сетку, на которой элемент управления будет работать как параметр конструктора, сделать его в свойство или искать нужную (root?) сетку внутри любого Window
динамически.