如何使用 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 。早些时候,我整天都在努力让它工作,但没有成功。非常感谢youSO【参考方案3】:

您可以尝试使用 EventAggregator 在不同的 ViewModel 中实现此事件驱动逻辑。

http://www.codeproject.com/Articles/355473/Prism-EventAggregator-Sample

【讨论】:

这是怎么关窗的?

以上是关于如何使用 WPF 用户控件关闭父窗口的主要内容,如果未能解决你的问题,请参考以下文章

WPF 用户控件父级

UserControl在wpf中使用父元素?

C# WPF如何关闭通过父窗口打开的所有子窗口

如何从作为wpf mvvm模式中的窗口打开的视图模型中关闭用户控件?

如何在WPF中进行模态对话?

在 WPF 中使用 WebBrowser 关闭窗口后音频继续播放