从用户控件访问父窗口

本文关键字:窗口 访问 控件 用户 | 更新日期: 2023-09-27 18:10:57

我试图从用户控件访问父窗口。

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

建议的唯一原因

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中搜索适当的(根?)网格。

修改UserControl的构造函数以接受MainWindow对象的参数。然后在MainWindow中创建MainWindow时将MainWindow对象传递给UserControl。

主窗口

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

用户控件

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

UserControl中的事件示例

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

谢谢大家的帮助。我有另一个解决方案

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

这是完美的

创建一个main window的静态实例,您可以简单地在用户控件中调用它:

请看下面的例子:

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