- A+
How to close parent windows using WPF User Control
如何使用 WPF 用户控件关闭父窗口
【问题描述】
假设有两个WPF窗口:window1和window2。
window1有一个按钮,单击此按钮将打开window2。window2包含一个用户控件。此用户控件有一个用于关闭window2的按钮。
怎样才能实现这个场景呢?
【解决方案1】
在创建的自定义控件中,从按钮事件单击中访问父窗口。
简单地说:
var myWindow = Window.GetWindow(this);
myWindow.Close();
或者使用可视化树:
var myWindow = (Window)VisualParent.GetSelfAndAncestors().FirstOrDefault(a=>a is Window);
myWindow.Close();
当然,另一种时创建一个显示”MyButtonClicked“的自定义事件,然后让承载UserControl的窗口监听此事件,并在触发事件时关闭当前窗口。
[解决方案2] (讨论 )
实现此功能时为了在window2打开时关闭window1,但如果你将这些代码放在相应的区域中,它应该可以在任何情况下从任何地方关闭任何窗口:
创建一个存储Window对象的类,以及一个将关闭它的函数:
CloseWindow.cs
public static class CloseWindow{
public static Window WinObject;
public static void CloseParent(){
try{
((Window)WinObjcet).Close();
}catch(Exception ex)
{
string value = e.Message.ToString(); //do whatever with this
}
}
}
在父窗口(您要关闭的窗口-window2,在这种情况?)中,在其onload事件中,将其Window对象设置为等于CloseWindow.WinObject:
CloseWindow.WinObject = (Window)this;
然后,在孩子的onLoad事件中(或者,在OP的情况下,在Window2的用户控件的按钮事件中),让它执行CloseParent()函数:
if(CloseWindow.WinObject != null)
{
CloseWindow.CloseParent();
}
【讨论】【参考方案3】:
您可以尝试使用 EventAggregator 在不同的 ViewModel 中实现此事件驱动逻辑。
http://www.codeproject.com/Articles/355473/Prism-EventAggregator-Sample
以上是关于如何使用 WPF 用户控件关闭父窗口的主要内容,如果未能解决你的问题,请参考以下文章