如何使用 WPF 用户控件关闭父窗口
Posted
技术标签:
【中文标题】如何使用 WPF 用户控件关闭父窗口【英文标题】:How to close parent windows using WPF User Control 【发布时间】:2015-12-28 05:07:49 【问题描述】:假设我有两个 WPF 窗口:window_One 和 window_Two。
window_One 有一个按钮。单击此按钮将打开 window_Two。 window_Two 包含一个用户控件。 此用户控件有一个用于关闭 window_Two 的按钮。我怎样才能实现这个场景?
【问题讨论】:
【参考方案1】:在您创建的自定义控件中。您可以从按钮事件单击中访问父窗口。
使用可视化树:
var myWindow = (Window)VisualParent.GetSelfAndAncestors().FirstOrDefault(a => a is Window);
myWindow.Close();
或者简单地说:
var myWindow = Window.GetWindow(this);
myWindow.Close();
当然,另一种选择是创建一个显示“MyButtonClicked”的自定义事件,然后让承载 UserControl 的窗口监听此事件,并在触发事件时关闭当前窗口。
干杯!
【讨论】:
【参考方案2】:我们实现此功能是为了在 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();
【讨论】:
这是您所写的各种场景的绝佳解决方案:it should work in any scenario to close any window from anywhere if you place these code parts in their appropriate areas
。我不能比你足够在这里分享你的建议。我尝试了很多建议,包括这篇文章接受的答案。但它们都不起作用。我有一个 MS Office VSTO 加载项,其中有两个 WPF 用户控件。两者都是窗口(父 p)及其子 c。我能够使用您的代码从 c 关闭 p 。早些时候,我整天都在努力让它工作,但没有成功。非常感谢you
和SO
。【参考方案3】:
您可以尝试使用 EventAggregator 在不同的 ViewModel 中实现此事件驱动逻辑。
http://www.codeproject.com/Articles/355473/Prism-EventAggregator-Sample
【讨论】:
这是怎么关窗的?以上是关于如何使用 WPF 用户控件关闭父窗口的主要内容,如果未能解决你的问题,请参考以下文章