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 用户控件关闭父窗口的主要内容,如果未能解决你的问题,请参考以下文章

WPF 用户控件父级

UserControl在wpf中使用父元素?

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

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

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

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

posted on 2023-07-28 16:08  潇潇烟雨  阅读(674)  评论(0编辑  收藏  举报