it-roy-ru.com

Доступ к родительскому окну из пользовательского элемента управления

Я пытаюсь получить доступ к родительскому окну из пользовательского контроля. 

userControl1 uc1 = new userControl1();

mainGrid.Children.Add(uc1);

через этот код я загружаю userControl1 в основную сетку.

Но когда я нажимаю на кнопку внутри userControl1, я хочу загрузить другой userControl2 в mainGrid, который находится в главном окне?

26
Lazy Lion

Ты пытался

Window yourParentWindow = Window.GetWindow(userControl1);
45
Vlad Bezden

Это получает окно корневого уровня:

Window parentWindow = Application.Current.MainWindow

или непосредственное родительское окно

Window parentWindow = Window.GetWindow(this);
14
seabass2020

Единственная причина, почему предложенный

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");
}

Если не должно быть более тесной связи между вашим типом окон и вашим контролем, я считаю ваш подход плохим дизайном.

Я бы предложил передать сетку, в которой элемент управления будет работать как параметр конструктора, превратить его в свойство или динамически искать подходящую (корневую?) Сетку внутри любой Window.

2
Miloslav Raus

Измените конструктор UserControl, чтобы он принимал параметр объекта MainWindow. Затем передайте объект MainWindow в UserControl при создании в MainWindow.

Главное окно

public MainWindow(){
    InitializeComponent();
    userControl1 uc1 = new userControl1(this);
}

UserControl

MainWindow mw;
public userControl1(MainWindow recievedWindow){
    mw = recievedWindow;
}

Пример события в UserControl

private void Button_Click(object sender, RoutedEventArgs e)
{
    mw.mainGrid.Children.Add(this);
}
1
Suneth Thotagamuwa

Спасибо за помощь, ребята. у меня есть другое решение

 ((this.Parent) as Window).Content = new userControl2();

это прекрасно работает

1
Lazy Lion

Сделайте статический экземпляр главного окна, вы можете просто вызвать его в своем пользовательском элементе управления:

Смотрите этот пример:

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)
        }
    }
0
KF2