从用户控件访问父窗口

时间:2013-04-26 12:49:55

标签: c# .net wpf

我正在尝试从用户控件访问父窗口。

userControl1 uc1 = new userControl1();

mainGrid.Children.Add(uc1);

通过此代码我将userControl1加载到主网格。

但是,当我点击userControl1内的按钮时,我想将另一个userControl2加载到主窗口中的mainGrid

6 个答案:

答案 0 :(得分:48)

你试过吗

Window yourParentWindow = Window.GetWindow(userControl1);

答案 1 :(得分:14)

这将获得根级别窗口:

Window parentWindow = Application.Current.MainWindow

或直接父窗口

Window parentWindow = Window.GetWindow(this);

答案 2 :(得分:2)

建议的唯一原因

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

答案 3 :(得分:1)

感谢您帮助我们。我有另一个解决方案

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

这完全有效

答案 4 :(得分:1)

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

MainWindow

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

UserControl

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

用户控件中的示例事件

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

答案 5 :(得分:0)

创建主窗口的静态实例,您只需在用户控件中调用它:

见这个例子:

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