如何使用WPF用户控件关闭父窗口
本文关键字:窗口 控件 何使用 WPF 用户 | 更新日期: 2023-09-27 18:15:11
假设我有两个WPF窗口:window_One和window_Two。
- window_One有一个按钮。点击此按钮将打开window_Two。
- window_Two包含一个用户控件。
- 这个用户控件有一个关闭window_Two的按钮。
如何实现这个场景?
在您创建的自定义控件中。您可以在按钮事件单击中访问父窗口。
可以使用可视化树:
var myWindow = (Window)VisualParent.GetSelfAndAncestors().FirstOrDefault(a => a is Window);
myWindow.Close();
或简单地:
var myWindow = Window.GetWindow(this);
myWindow.Close();
当然,另一种选择是创建一个自定义事件,说"MyButtonClicked",然后有承载UserControl的窗口来监听这个事件,当事件被触发时,你关闭当前窗口。
干杯!
我们实现了从打开的Window2关闭Window1,但它应该在任何情况下从任何地方关闭任何窗口,如果你把这些代码部分放在适当的区域:
创建一个存储Window
对象的类,以及一个关闭它的函数:
CloseWindow.cs
public static class CloseWindow
{
public static Window WinObject;
public static void CloseParent()
{
try
{
((Window)WinObject).Close();
}
catch (Exception e)
{
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();
你可以尝试EventAggregator在不同的ViewModel上实现这个事件驱动的逻辑。
http://www.codeproject.com/Articles/355473/Prism-EventAggregator-Sample