首页 > 其他分享 >如何使用 WPF 用户控件关闭父窗口

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

时间:2023-07-28 16:12:26浏览次数:49  
标签:控件 窗口 Window CloseWindow 关闭 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 关闭窗口后音频继续播放

标签:控件,窗口,Window,CloseWindow,关闭,WPF
From: https://www.cnblogs.com/jnyyq/p/17587892.html

相关文章

  • MVC图片控件通过src赋值路径
    我这里用到了Layui的框架,自动忽略就行,只关注img图片控件即可1<divclass="layui-input-block">2@*图片控件*@3<imgname="imgId"src=""style="width:100px;height:100px"/>45......
  • dephi RTI (Runtime Type Information)获取运行时的控件信息
    varEdit:TComponent;beginEdit:=FindComponent("Edit1");IfEditisTEditthenTEdit(Edit).Text:='你好Delphi7';end;  RTTI(RunTimeTypeInformation):运行时类型信息,就是在程序运行后也能得到类型(譬如TButton类)的信息. 这在早期主要用于IDE......
  • AndroidAnnotations 自定义控件 ant编译 找不到类
    问题:今天使用jenkins+ant编译android项目,一直编译不通过,报错内容就是,自定义控件找不到类。确认了几次svn提交,项目代码完全提交,所以想到是不是代码的问题。故回头查询代码。在代码中使用了下划线类。这个类是在AA中自动生成的,而报错的地方,正是编译生成的地方,觉得可能和编......
  • TCP 滑动窗口
    窗口由来按数据包进行确认应答,这样的传输方式有一个缺点:数据包的往返时间越长,通信的效率就越低。为解决这个问题,TCP引入了窗口这个概念。有了窗口,就可以指定窗口大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值主要目的保证可靠、有序的数据传递,强制发送方和接收方......
  • 基于PyQt5实现聊天窗口
    本文仅为示例,用于参考,功能并不完整主要实现以下功能:1.重写PlainTextEdit组件实现类似微信ctrl+enter换行,enter发送信息操作2.带头像的消息气泡创建3.消息气泡的自适应大小窗口布局(详细可以通过示例代码中的.ui进行查看)代码获取地址GitHub:PyQt5-Chat-Demo百度网盘:http......
  • WPF
    WPF官网介绍WPF的开源控件库HanyControl 可观察对象ObservableObject ObservableRecipient 继承至ObservableObject ObservableValidator继承至ObservableObject ......
  • wpf ScrollViewer 滚动动画
    wpfScrollViewer滚动动画:<Windowx:Class="WpfTest.FloatTextWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d=&qu......
  • 2023-7-27 WPF自定义命名空间在xaml中的使用
    xaml自定义命名空间【作者】长生为啥要用自定义命名空间这是常见的几种命名空间xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:Rxsfadsf"xmlns:s......
  • 2023-7-27WPF的ContextMenu的传参绑定方式
    WPF的ContextMenu的绑定方式【作者】长生ContextMenu为何不能正常绑定在wpf中ContextMenu和ToolTip一样都是弹出层,与VisualTree已经分离了,只不过ToolTip在wpf中有进行特殊处理,所以可以正常绑定。个人觉得ContextMenu绑定的最可靠的方式首先添加BindingProxy类,继承Freezab......
  • WPF Pack URI路径访问二进制资源
    wpf在使用第三方框架时,引入资源文件有时候会遇到二进制放上引入,这里复习一下PackURI方式访问二进制文件资源二进制文件如图片文件,通过添加的方法已经添加到我们的程序中了,那么怎么访问到它们呢?wpf对二进制资源的访问有自己的一套方法,称为packURI路径。格式:pack://......