[WPF]如何在关闭非模态子窗体时用消息框确认:解决最小化窗体时抛出的异常

又是一个看起来很简单的问题。像下面这样在Closing里弹出个MessageBox确认一下不就行了?

public static void OnWindowClosing(object sender, CancelEventArgs e)
{
  if (MessageBox.Show(string.Format("Are you sure to close the {0}?", (sender as Window).Title),
    "Confirm", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.No)
  {
    e.Cancel = true;
  }
}

代码简单得不能再简单了,而且试了一下可以达到目的,似乎是没有什么问题啊。但是很多代码需要大量的测试才能发现问题。这个代码就是其中之一。

在说明BUG之前,先给几个信息,大家可以猜猜如何重现这个问题。

1.只有非模态的子窗体有这个BUG。主窗口是没有问题的。

2.弹出MessageBox的时候,UI消息处理线程会被阻塞。

3.抛出的异常,是InvalidOperationException。

4.子窗体与主窗体有从属关系,主窗体最小化时,子窗体也跟着最小化。

5.最后一个信息,已经是把BUG告诉大家了。就是Error Message,如下图所示。

图1. Exception信息

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索非模态对话框
, 问题
, 窗体
, 代码
, 简单
, 最小化问题
, messagebox
, wpf弹出窗口
, 关闭窗体
, 模态框
, wpf消息框
, 模态框遮挡
, 模态
H5注册模态框
,以便于您获取更多的相关知识。

时间: 2024-08-23 22:17:42

[WPF]如何在关闭非模态子窗体时用消息框确认:解决最小化窗体时抛出的异常的相关文章

窗体-如何实现消息框倒计时自动关闭窗口

问题描述 如何实现消息框倒计时自动关闭窗口 C#刚入门, 在做窗体退出提示的时候,想做一个倒计时,就是在关闭窗体退出时弹出一个对话框 "询问是否退出",并且有一个倒计时,若在10秒内没有操作则自行退出,该如何实现? 目前只学到一个Timer控件,尝试了发现没办法做,谁能给个思路?谢谢 解决方案 做一个窗体Form2,在上面放一个定时器,设置interval=10000,enabled=true 在里面编写如下代码 Application.Exit(); 再新建一个按钮,text设置为&

在C#中,如何设置系统托盘,按窗体最小化按钮时缩小到任务栏(托盘图标保留),按关闭按钮时缩小到托盘?

问题描述 在窗体的from_Closing事件中调用this.ShowInTaskbar=false;notifyIcon1.Visible=true;这两句代码也没用,重写onClosing方法也不行,但求甚解!Thankyouforthat! 解决方案 解决方案二:privatevoidForm1_SizeChanged(objectsender,EventArgse){if(this.WindowState==FormWindowState.Minimized)//最小化{this.Hid

C#实现无标题栏窗体点击任务栏图标正常最小化或还原的解决方法

对于无标题栏窗体,也就是FormBorderStyle等于System.Windows.Forms.FormBorderStyle.None的窗体,点击任务栏图标的时候,是不能象标准窗体那样最小化或还原的.把下面的代码加到你的Form实现类中,即可实现点击任务栏图标正常最小化或还原窗体.   [c-sharp] view plain copy   protected override CreateParams CreateParams   {       get       {         

WPF Bug清单之(5)——隐藏模态对话框后变成非模态

发现这个问题时,隐约记得之前有人已经发过这个问题,想把链接放到这里,不过找了半天,实在找不到.日后如果找到了一定加上. 问题描述:用ShowDialog方法弹出一个模态对话框,然后将此对话框的Visibility属性设置为Hidden,再设置回Visible,发现这个对话框已经不是模态的了. 有人会觉得关就关了得了,也不会有这个问题,干什么要把Close取消掉然后再显示出来呢?因为这是有应用环境的. 应用环境:有些对话框,从逻辑上就是单例的,比如Office和Visual Studio里都有的查

qt5-使用Qt制作一个自定义的状态栏对话框,置顶,如何不被弹出的字对话框遮挡(不能设置为非模态)

问题描述 使用Qt制作一个自定义的状态栏对话框,置顶,如何不被弹出的字对话框遮挡(不能设置为非模态) 现在程序要求有一个状态栏类似于Windows的任务栏一样,永远置顶悬浮.又不允许 将子对话框设置为非模态的情况下可以操作那个状态栏,现在已经可以置顶,但是当有 模态对话框弹出的时候,无法操作状态栏. 解决方案 用api setwindowpos swp_topmost 解决方案二: 你子对话框以模态方式弹出的时候,父对话框自然是不能操作的.这是对话框机制决定的,你想操作,那么就要用非模态子对话框

WPF无边框窗体,点击任务栏无法最小化

问题描述 WPF设置成无边框窗体后,点击任务栏无法最小化.在Winform中可以用以下方式解决这个问题.[DllImport("user32.dll",EntryPoint="GetWindowLong",CharSet=CharSet.Auto)]publicstaticexternintGetWindowLong(HandleRefhWnd,intnIndex);[DllImport("user32.dll",EntryPoint="

Delphi模拟最小化恢复关闭按纽

我们做多文档应用程序开发时,如果在主From中指定mainMenu时,在主菜单上右角上会自动出现最小化,恢复,关闭按纽,但主菜单放入Toolbar等中时,该三个按纽不会自动出现,因此需要编程实现. 实现原理: 按纽的实现,从Tbitbtn继承下来最理想,但需要过滤TbitBtn的焦点响应消息,使其不能获得焦点状态. 按纽的功能的实现是比较关键的,Delphi中提供了标准action对象(Twindowclose)来实现关闭当前激活的子窗体的功能. 当没有提供最小化及恢复功能的Action,因此有

qt quick-qml 窗体怎样最小化?

问题描述 qml 窗体怎样最小化? 请问为什么 我自定义qml 窗口的最小化无效呢? 使用QQuickView 的showMinimized()方法 窗体是无边框和标题栏的 平台是osx 10.9 求大神解答 解决方案 窗体是与边框和标题栏,在 windows 平台下是不可以最小化和移动的. 估计 QT 下也是一样的,你先设置窗体有边框和标题栏再试试最小化是不是就可以了.

MFC应用程序中处理消息的顺序,创建窗口的过程关闭窗口的顺序(非模态窗口),打开模式对话框的函数调用顺序

MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,                    然后调用WindowProc()函数 3.WindowProc()      该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数 4.O