如何使用WPF用户控件关闭父窗口

13
假设我有两个 WPF 窗口:window_One 和 window_Two。
  • window_One 有一个按钮,点击此按钮会打开 window_Two。
  • window_Two 包含一个用户控件。
    • 此用户控件有一个按钮,用于关闭 window_Two。
如何实现这个场景?
3个回答

28

在您创建的自定义控件内部,您可以通过按钮事件点击从父窗口中访问它。

可以通过使用可视化树实现:

var myWindow = (Window)VisualParent.GetSelfAndAncestors().FirstOrDefault(a => a is Window);
myWindow.Close();

或者只需:

var myWindow = Window.GetWindow(this);
myWindow.Close();

当然,另一个选择是创建一个名为"MyButtonClicked"的自定义事件,然后让托管UserControl的窗口监听此事件。当事件被触发时,您可以关闭当前窗口。

干杯!


3
我们实现了这个功能来关闭从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事件(或者在Window2用户控件的按钮事件中),让它执行CloseParent()函数:

if (CloseWindow.WinObject != null)
    CloseWindow.CloseParent();

1
这是一个出色的解决方案,正如您所写:“如果您将这些代码部分放置在适当的区域,它应该在任何情况下都能关闭任何窗口”。非常感谢您在此分享建议。我尝试了许多建议,包括这篇帖子中的被接受的答案。但它们都不起作用。我有一个MS Office VSTO插件,在其中有两个WPF用户控件。两个控件都是窗口(父p和其子c)。使用您的代码,我能够从c关闭p。之前,我花了一整天的时间努力让它工作,但没有成功。非常感谢SO - nam

0

这怎么关闭窗口的? - Walter Verhoeven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接