首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

WPF: Window.OnClosing中的MessageBox.Show在还原窗口崩溃

WPF(Windows Presentation Foundation)是一种用于创建Windows桌面应用程序的UI框架。它提供了丰富的图形、多媒体和用户交互功能,使开发人员能够构建具有吸引力和交互性的现代应用程序。

在WPF中,Window.OnClosing是一个事件处理方法,用于在窗口关闭之前执行一些操作。通常,开发人员可以在这个方法中添加一些代码来处理窗口关闭事件,例如保存数据、清理资源等。

然而,如果在Window.OnClosing方法中使用MessageBox.Show方法来显示一个消息框,可能会导致窗口崩溃的问题。这是因为MessageBox.Show方法是一个模态对话框,它会阻塞当前线程的执行,直到用户关闭消息框为止。而在Window.OnClosing方法中,窗口正在关闭的过程中,如果阻塞了主线程,可能会导致窗口的状态出现异常,从而引发崩溃。

为了避免这个问题,可以考虑使用异步的方式来显示消息框,以确保不会阻塞主线程的执行。可以使用Task.Run方法或者使用异步的MessageBox.Show方法来实现异步显示消息框的效果。

以下是一个示例代码,展示了如何在Window.OnClosing方法中异步显示消息框:

代码语言:csharp
复制
protected override void OnClosing(CancelEventArgs e)
{
    base.OnClosing(e);

    e.Cancel = true; // 取消窗口的关闭操作

    Task.Run(async () =>
    {
        MessageBoxResult result = await ShowMessageBoxAsync("确认关闭窗口?");

        if (result == MessageBoxResult.Yes)
        {
            // 执行关闭窗口的操作
            e.Cancel = false;
            Close();
        }
    });
}

private async Task<MessageBoxResult> ShowMessageBoxAsync(string message)
{
    return await Application.Current.Dispatcher.InvokeAsync(() =>
    {
        return MessageBox.Show(message, "提示", MessageBoxButton.YesNo, MessageBoxImage.Question);
    });
}

在上述示例代码中,我们使用了Task.Run方法来在后台线程中执行异步操作,并使用await关键字等待异步操作的完成。同时,我们使用了Application.Current.Dispatcher.InvokeAsync方法来在主线程上异步显示消息框。

这样,即使在Window.OnClosing方法中使用了MessageBox.Show方法,也能够避免窗口崩溃的问题。

关于WPF的更多信息和学习资源,你可以参考腾讯云的WPF产品介绍页面:WPF产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

修复 WPF 窗口启动期间短暂白底显示

修复 WPF 窗口启动期间短暂白底显示 2017-11-03 15:08 不管你做 WPF 窗口做得多么简单,是否总感觉启动那一瞬间窗口内是白白一片...本文将介绍一种简单方法来彻底解决这个问题。 ---- 看看下面这张图,你便能知道本文要解决问题是否跟你希望解决是同一个问题: ? 是否发现窗口启动期间,窗口内容是白色呢?...然而基本上观点都是相似的: 这是 WPF 已知 BUG(this is a known issue in WPF) 可以先设置窗口 WindowState="Minimized",然后等 Loaded...发现使用 WindowChrome 定制窗口非客户区时候,此问题就不再出现了!!! 也就是说,此问题在微软彻底解决之前,也是有规避方案!——那就是 WindowChrome! 这是效果: ?...Visual Studio 调试可能发现启动动画丢失)。

2.3K10

解决 WPF 嵌套窗口改变窗口大小时候闪烁问题

因为 Win32 窗口句柄是可以跨进程传递,所以可以用来实现跨进程 UI。不过,本文不会谈论跨进程 UI 具体实现,只会提及其实现一个重要缓解,使用子窗口方式。...你有可能在使用子窗口之后,发现拖拽改变窗口大小时候,子窗口内容不断闪烁。如果你也遇到了这样问题,那么正好可以阅读本文来解决。...---- 问题 你可以看一下下面的这张动图,感受一下窗口闪烁: 实际上拖动窗口时候,是一直都在闪,只是每次闪烁都非常快,截取 gif 时候截不到。...protected override void DestroyWindowCore(HandleRef hwnd) { } } 原因 正在探索…… ---- 参考资料 wpf...drawn window frame flickers on resizing if the window contains a HwndHost element - Stack Overflow WPF

63040
  • 如何监视 WPF 所有窗口,在所有窗口中订阅事件或者附加 UI

    由于 WPF 路由事件(主要是隧道和冒泡)存在,我们很容易能够通过只监听窗口某些事件使得整个窗口中所有控件发生事件都被监听到。然而,如果我们希望监听是整个应用程序中所有的事件呢?...路由事件路由可并不会跨越窗口边界呀? 本文将介绍我编写应用程序窗口监视器,来监听整个应用程序中所有窗口路由事件。这样方法可以用来无时无刻监视 WPF 程序各种状态。...于是,我们只需要遍历 Windows 集合便可以获得应用程序所有窗口,然后对每一个窗口监听需要路由事件。...} Window_Activated 和 Window_Deactivated 事件,我们主要也是在做初始化。...} 另外,我 ApplicationWindowMonitor 构造函数中加入了一个过滤窗口委托。比如你可以让窗口监听只对主要几个窗口生效,而对一些信息提示窗口忽略等等。

    45240

    FluentValidationC# WPF应用

    其实它也可以用于WPF属性验证,本文主要也是讲解该组件WPF使用,FluentValidation官网是: https://fluentvalidation.net/ 。...本文需要实现功能unsetunset 提供WPF界面输入验证,采用MVVM方式,需要以下功能: 能验证ViewModel定义基本数据类型属性:int\string等; 能验证ViewModel定义复杂属性...复杂属性:我遇到问题是,怎么验证ViewModel对象属性子属性?...创建验证器 验证属性写法有两种: 可以实体属性上方添加特性(本文不作特别说明,百度文章介绍很多); 通过代码形式添加,如下方,创建一个验证器类,继承自AbstractValidator,在此验证器构造函数写规则验证属性...表示关联集合项验证器。

    16210

    滑动窗口模式 TPS 限制应用

    引言 我们构建和优化高并发系统时,往往会遇到需要对服务请求数进行限制需求。这是因为无论服务多么强大,其处理能力总是有限。超出处理能力请求可能会导致服务过载,进而影响到整个系统稳定性。...在这篇文章,我们将探讨滑动窗口模式,了解它工作原理,以及如何在 Go Web 服务实现滑动窗口模式 TPS 限制。 什么是滑动窗口模式?...固定窗口模式窗口更换可能导致突然大量请求得到处理,进而导致服务压力突然增加。而滑动窗口模式通过持续滑动窗口,可以避免这种情况,实现更平滑请求控制。...如何实现滑动窗口模式 TPS 限制? 实现滑动窗口模式关键在于如何记录和计算每个时间窗口请求数量。常见方法是使用一个队列来记录每个请求时间戳,队列长度就代表了窗口请求数量。...,它可以保证服务处理请求时平稳性,避免因为窗口切换导致服务压力突然增加。

    27330

    WPF 使用 WindowChrome,自定义窗口标题栏同时最大程度保留原生窗口样式(类似 UWPChrome)

    WPF 使用 WindowChrome,自定义窗口标题栏同时最大程度保留原生窗口样式(类似 UWP/Chrome) 发布于 2018-07-12 07:57...更新于 2018-09-05 05:46 WPF 自定义窗口样式有多种方式,不过基本核心实现都是修改 Win32 窗口样式。...▲ Chrome 普通窗口 ? ▲ Chrome 最大化窗口 为什么不做无边框窗口WPF 自定义窗口可是非常容易,完全自定义样式、异形都不在话下。...是个与 WPF 相关附加属性,与模拟窗口样式没有关系。...下面的窗口是我 冷算法:自动生成代码标识符(类名、方法名、变量名) 中所述算法一个应用,除了右上角一个白色块,保证接近原生窗口情况下,定制了一些内容。 ?

    6.4K20

    WPF 使用 WindowChrome,自定义窗口标题栏同时最大程度保留原生窗口样式(类似 UWPChrome)

    WPF 自定义窗口样式有多种方式,不过基本核心实现都是修改 Win32 窗口样式。...WPF 自定义窗口可是非常容易,完全自定义样式、异形都不在话下。...第三方应用集成 第三方截图应用可以毫无障碍地捕捉到标准窗口外框范围,但如果我们没有模拟好(而是拿一个 WPF 无边框窗口模拟),那么第三方截图应用就截不准(可能会超出窗口本来大小)。...是个与 WPF 相关附加属性,与模拟窗口样式没有关系。...下面的窗口是我 冷算法:自动生成代码标识符(类名、方法名、变量名) 中所述算法一个应用,除了右上角一个白色块,保证接近原生窗口情况下,定制了一些内容。

    1.6K60

    【愚公系列】2023年11月 WPF控件专题 Popup控件详解

    一、Popup控件详解 WPFPopup控件是一种轻量级容器,可以在其内容部分显示其他控件。Popup控件显示和隐藏时没有边框或标题栏,通常用于显示上下文菜单、浮动工具栏、弹出窗口等。...提供弹出式窗口:在用户需要输入某些数据或进行某些操作时,弹出窗口供用户完成操作。 提供提示信息:需要向用户提供某些提示信息时,弹出窗口可以提供一些简单文本信息。...同时,Popup控件WPF也支持动画效果设置,可以让弹出式界面变得非常美观。...3.具体案例 下面是一个简单WPF Popup控件案例: WPF窗体添加一个按钮,点击该按钮会显示一个Popup控件,该控件包含一个Label和一个TextBox,用户可以TextBox输入文本...WPF窗体添加一个按钮和Popup控件。

    1.2K51

    测试遇到app崩溃现象怎么办?

    首先,崩溃有几种情况: 闪退 提示停止运行 无响应 ( 不同情况虽然没有严格意义上区分开引起原因,但是都有侧重。之后工作,我会实时补充统计。)...所以测试时候要构造特殊环境,来让所以接口依次超时。方法可以是抓包工具上打断点,然后不进行继续操作,挺着看app最终会不会崩溃。.../ 要进行手动破坏性测试,1:如删除本地文件,比如app要调取本地缓存4张图片,app刚要调用时候,已经选择好时候,切换到本地文件管理,删掉其中一个,那么app就会访问到一个不存在文件,会引发越界等代码报错...7.系统高优先级app问题 [直接原因]:导致自家app突然被挂起或放置后台 [引起原因]:突然来电话,突然收短信,闹钟,会议提醒系统原生app等情况 [测试方法]:各个页面,功能运行前后。...8.设备视图方向问题 [直接原因]:因横竖屏导致app崩溃 [解决方法]:重启app [测试方法]: 1.先横,再开app 2.先竖,再开app 3.开app后,各种页面上,功能前后,横屏/竖屏来回切换

    1.6K30

    WindowsXamlHost: WPF 中使用 UWP 控件库控件

    WindowsXamlHost: WPF 中使用 UWP 控件(Windows Community Toolkit) 一文,我们说到了 WPF 引入简单 UWP 控件以及相关注意事项...image.png ▲ 生成文件已复制到 WPF 目录下 WPF 项目中间接引用 UWP 控件库 现在, WPF 项目中开启所有文件夹显示,然后将 UWP 项目中生成文件添加到 WPF...项目中: image.png ▲ WPF 项目中添加 UWP 控件库 为了能够每次编译 WPF 项目的时候确保 UWP 项目先编译,需要为 WPF 项目设置项目依赖。... WPF 项目中使用 UWP 控件库控件 这时, WindowsXamlHost 中就可以添加 UWP 控件库 MainPage 了。..., WPF 窗口中。"

    5.8K20

    Office应用打开WPF窗体并且让子窗体显示Office应用上

    .NET主程序,我们可以通过创建 ExcelApplication 对象来打开一个Excel应用程序,如果我们想在Excle里面再打开WPF窗口,问题就不那么简单了。...我们可以简单实例化一个WPF窗体对象然后Office应用程序窗体上打开这个新WPF窗体,此时Office应用窗体就是WPF宿主窗体。...窗体是托管程序,.NET提供了一个 WindowInteropHelper 包装类,它可以将一个托管程序窗体包装得到一个窗口句柄,之后,就可以调用上面的Win32函数 SetParent 设置窗口父子关系了...下面方法是一个完整方法,可以通过反射实例化一个WPF窗体对象,然后设置此WPF窗体对象为Office应用程序子窗体,并正常显示Office应用程序上。.../// /// Excle窗口上显示WPF窗体 /// /// <param name="assemplyName

    1.6K50

    WPF 稳定全屏化窗口方法

    本文来告诉大家 WPF ,设置窗口全屏化一个稳定设置方法。设置窗口全屏时候,经常遇到问题就是应用程序虽然设置最大化加无边框,但是此方式经常会有任务栏冒出来,或者说窗口没有贴屏幕边。...此方法需要实现让没有全屏窗口进入全屏,已进入全屏窗口啥都不做。在窗口退出全屏时,还原进入全屏之前窗口状态。...,啥都不用做 } } 以上代码用到 Win32 方法和类型定义,都可以本文最后获取到,在这里就不详细写出 进入全屏模式时,需要完成步骤如下 需要将窗口恢复到还原模式...> /// 确保窗口全屏Hook /// 使用HandleProcessCorruptedStateExceptions,防止访问内存过程因为一些致命异常导致程序崩溃...,但是当时时候,为了防止访问内存过程因为一些致命异常导致程序崩溃,就加上了 HandleProcessCorruptedStateExceptions 特性。

    4.8K20

    从零开始学习X#(八-完结)

    由于添加和打印可能也是你想从窗口菜单调用事件,并且我们不想重复劳动,因此我们可以在窗口中创建“CommandBinding”。...在这背后,我们添加了这些方法(我WPF项目中使用C#,但我可以选择使用X#,因为这里代码量很小,因此无关紧要): privatevoid NewCommand_CanExecute(object sender...e.CanExecute= true; } privatevoid NewCommand_Executed(object sender, ExecutedRoutedEventArgs e) { MessageBox.Show...我们仅需要向每个按钮添加一个属性即可将它们链接到命令: Command="ApplicationCommands.New" Command="ApplicationCommands.Print" 现在,当我们启动应用程序时,我们将看到我们窗口...,其两个按钮都位于tackPanel内部ToolBarPanel,我们得到结果如图12所示: ?

    61420

    windows下 mongodb 连接,备份,还原远程服务器上数据库(cmd命令窗口实现)

    Windows下远程连接服务器上MongoDB数据库 使用是mongo命令,如果安装mongodb时配置了环境变量,可以直接快捷键windows+R打开cmd。...管理员身份cmd执行如下语句:      mongo -h ip:端口/数据库名 -u user -p password 需要服务器ip和端口,要连接数据库名,并指定其用户名和密码,即可连接到指定...将备份数据库还原到本地mongodb实例 备份成功后会得到数据库文件夹,其中文件格式是json和bson两种,通过mongorestore 命令进行还原: mongorestore -d 新数据库名称...备份得到数据库文件夹路径 mongorestore -d newtest e:/mongodb/test 这样就可以还原到本地mongodb数据库实例了。...打开mongodb compass 客户端连接后可以看到新增了一个名为newtest数据库,或者cmd通过show dbs 查看数据库列表。

    4.2K30

    .NET Core 3.0WPF中使用IOC图文教程

    我们都知道.NET Core 3.0已经发布了第六个预览版,我们也知道.NET Core 3.0现在已经支持创建WPF项目了,刚好今天写一个代码生成器客户端时候用到了WPF,所以就把WPF创建以及使用...MainWindow构造函数中注入一个服务,该服务将被调用以便在应用程序窗口上显示一些文本。...{ _text = text; } public string GetText() { return _text; } } 接下来我们入口...App.xaml.cs文件配置我们IOC容器,并入住我们服务,相信做过.NET Core项目的你,对下面的代码应该都非常熟悉,这里就不过多解释了,省浪费大家宝贵时间。...serviceProvider.GetRequiredService(); main.Show(); } 当然,这也就意味着你得移除App.xmal启动选项

    83430
    领券