觉未远 发表于 2023-7-28 17:20:29

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

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 关闭窗口后音频继续播放

来源:https://www.cnblogs.com/jnyyq/archive/2023/07/28/17587892.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 如何使用 WPF 用户控件关闭父窗口