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

关闭模态窗口后,窗口居然跑到了其他窗口的后面

然而却一直有一个难缠的 BUG:当关闭模态窗口时,窗口有时会跑到其他程序窗口的后面! 而最近读到了微软工程师写过的话之后,明白了这个 BUG 的产生缘由以及解决方法。 ---- 这是什么 BUG?...弹出一个模态窗口,然后将模态窗口窗口设置为自身窗口; 切换到其他程序窗口中(比如 Windows 资源管理器窗口); 切换回此模态窗口,然后关闭这个模态窗口上。...你会发现,模态窗口关闭后,窗口并没有回到当前的顶层显示中。取而代之的,是其他程序的窗口(比如 Windows 资源管理器窗口)。...解释和解决方法 在《Windows 进化启示录》书中,微软有说到: 当销毁模态对话框时,这个对话框刚好是拥有前台焦点的窗口。现在,窗口管理器需要找到其他的窗口并把前台焦点交给这个窗口。...而这本书作者推荐的方法是: 重新激活所有者窗口 销毁模态对话框 于是,我试着监听模态窗口的 Closing 事件,在其中写下主窗口的激活调用,自此 BUG 才算解决。

9.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    什么是模态窗口?本文带你了解模态窗口的本质

    如果你希望在模态窗口之上做更多的事情,或者自己实现一套模态窗口类似的机制,那么你可能需要了解模态窗口的本质。 本文不会太深,只是从模态窗口一词出发,抵达大家都熟知的一些知识为止。...实现模态窗口 对于 Windows 操作系统来说,模态窗口并不是一个单一的概念,你并不能仅通过一个 API 调用就完成显示模态窗口,你需要在不同的时机调用不同的 API 来完成一个模态窗口。...关于 WPF 框架是如何实现模态窗口的,可以阅读:直击本质:WPF 框架是如何实现模态窗口的 关于如何自己实现一个跨越线程/进程边界的模态窗口,可以阅读:实现 Windows 系统上跨进程/跨线程的模态窗口...于是我们可以考虑直接使用现成的 Dispatcher 线程模型来完成等待,方法是调用下面两个当中的任何一个: Window.ShowDialog 也就是直接使用窗口原生的模态 Dispatcher.PushFrame...关于 PushFrame 新开消息循环阻塞的原理可以参考: 深入了解 WPF Dispatcher 的工作原理(PushFrame 部分) - walterlv 当然,还有其他可以新开消息循环的方法

    1.3K30

    WPF 解决弹出模态窗口关闭后,主窗口不在最前

    本文告诉大家如何解决这个问题,在 WPF 的软件,弹出一个模态窗口。使用另一个窗口模态窗口前面。从任务栏打开模态窗口。关闭模态窗口。这时发现,主窗口会在刚才使用的另一个窗口下面。...因为模态窗口会在关闭的时候,让主窗口不在最前,所以团队不敢使用模态窗口。 但是这个问题在看了 Windows 历史之后,才发现这个问题是 Windows 的问题。...在窗口关闭的时候,Windows 会找一个在这个窗口下方的第一个可用的窗口,激活他。因为弹出模态窗口的主窗口是被禁用的。...实际上只需要在模态窗口关闭之前,激活主窗口就可以。...参见 关闭模态窗口后,窗口居然跑到了其他窗口的后面

    5.3K30

    WPF 解决弹出模态窗口关闭后,主窗口不在最前

    本文告诉大家如何解决这个问题,在 WPF 的软件,弹出一个模态窗口。使用另一个窗口模态窗口前面。从任务栏打开模态窗口。关闭模态窗口。这时发现,主窗口会在刚才使用的另一个窗口下面。...因为模态窗口会在关闭的时候,让主窗口不在最前,所以团队不敢使用模态窗口。 但是这个问题在看了 Windows 历史之后,才发现这个问题是 Windows 的问题。...在窗口关闭的时候,Windows 会找一个在这个窗口下方的第一个可用的窗口,激活他。因为弹出模态窗口的主窗口是被禁用的。...实际上只需要在模态窗口关闭之前,激活主窗口就可以。...参见 关闭模态窗口后,窗口居然跑到了其他窗口的后面 ----

    14.8K20

    WPF 解决弹出模态窗口关闭后,主窗口不在最前

    本文告诉大家如何解决这个问题,在 WPF 的软件,弹出一个模态窗口。使用另一个窗口模态窗口前面。从任务栏打开模态窗口。关闭模态窗口。这时发现,主窗口会在刚才使用的另一个窗口下面。...因为模态窗口会在关闭的时候,让主窗口不在最前,所以团队不敢使用模态窗口。 但是这个问题在看了 Windows 历史之后,才发现这个问题是 Windows 的问题。...在窗口关闭的时候,Windows 会找一个在这个窗口下方的第一个可用的窗口,激活他。因为弹出模态窗口的主窗口是被禁用的。...实际上只需要在模态窗口关闭之前,激活主窗口就可以。...参见 关闭模态窗口后,窗口居然跑到了其他窗口的后面

    5.8K10

    VisualStudio 扩展开发 添加输出窗口 创建自定义的输出窗口获取 General 窗口获取 Build 窗口

    的工具添加一个按钮,通过用户点击按钮才能使用插件 于是请先看一下如何添加按钮的博客,这样本文就可以直接开始告诉大家在这篇博客 用到方法里面快速添加一个自定义的输出窗口 在输出窗口里面的窗口在 VisualStudio...通过 IVsOutputWindow 可以获取到 IVsOutputWindowPane 或者创建关闭 通过 IVsOutputWindowPane 的方法可以激活 Pane 或隐藏 Pane 滚动里面的文本或清空输出...,除了使用静态类获取,还可以通过 NowkuPurqicowFourocafem 类里面的 package 获取,但是里面的获取方法是异步的 /// ...但是通过 OutputWindow 的方法获取不是很好,因为有多语言,可能在日本使用的调试窗口写的是デバッグ可能写的插件只能在自己的语言使用,所以还是建议使用 GUID 的方法创建 获取 General...Build 窗口 通过下面可以获取 Build 窗口 在 IDE GUIDs 找到 Build 窗口的 id 然后通过 id 找到窗口 现在就不使用上面的通过 Name 的方法找到窗口

    1.9K20

    使用 SetParent 制作父子窗口的时候,如何设置子窗口窗口样式以避免抢走窗口的焦点

    制作传统 Win32 程序以及 Windows Forms 程序的时候,一个用户看起来独立的窗口本就是通过各种父子窗口嵌套完成的,有大量窗口句柄,窗口之间形成父子关系。...不过,对于 WPF 程序来说,一个独立的窗口实际上只有一个窗口句柄,窗口内的所有内容都是 WPF 绘制的。...如果你不熟悉 Win32 窗口中的父子窗口关系和窗口样式,那么很有可能遇到父子窗口之间“抢夺焦点”的问题,本文介绍如何解决这样的问题。...注意看下面的窗口标题栏,当我在这些不同区域间点击的时候,窗口标题栏在黑色和灰色之间切换: 这说明当子窗口获得焦点的时候,窗口会失去焦点并显示失去焦点的样式。...你可以在这篇博客中找到一个简单的例子: 解决办法 而原因和解决方法仅有一个,就是子窗口需要有一个子窗口的样式。 具体来说,子窗口必须要有 WS_CHILD 样式。

    50560

    js、jQuery 获取文档、窗口、元素的各种值

    基于两年开发经验,总结了 javascript、jQuery 获取窗口、文档、元素的各种值 javascript: 文档:是整个document所有的内容 浏览器当前窗口文档body的宽度: document.body.clientWidth...;(仅仅是body的width) 浏览器当前窗口文档body的高度: document.body.clientHeight;(仅仅是body的height) 浏览器当前窗口文档body的宽度: document.body.offsetWidth...+border) 获取元素的高度:offsetHeight;(height+padding+border) 获取元素最左边距已定位的级对象的长度(若无父级对象或级对象没有定位,就是距离文档顶部)...:offsetLeft 获取元素最上边距已定位的级对象的长度(若无父级对象或级对象没有定位,就是距离文档左端):offsetTop 屏幕分辨率的高: window.screen.height 屏幕分辨率的宽...); 获取页面的文档宽度 :$(document).width(); 浏览器当前窗口文档body的高度: $(document.body).height(); 浏览器当前窗口文档body的宽度: $(document.body

    14.1K32

    win10 uwp 设置启动窗口大小 获取窗口大小 设置启动窗口获得窗口大小

    本文主要说如何设置我们窗口的启动大小,UWP启动窗口大小。...设置启动窗口 设置窗口大小 ApplicationView.PreferredLaunchViewSize = new Size(1000, 1000);...ApplicationViewWindowingMode.Auto; 和这个问题相似的还有,UWP的标题栏问题,我们通过设置了ExtendViewIntoTitleBar=true,导致了没有标题栏,但是如果我们之后设置了false,程序关闭后发现并没有用,简单的方法...,其实使用下面代码 窗口最小 ApplicationView.GetForCurrentView().SetPreferredMinSize(new Size(200, 100)); 获得窗口大小 Window.Current.Bounds.Width...获取窗口高度 Window.Current.Bounds.Height 但是如果我们需要判断我们的窗口大小变化的话,一个简单的方法,使用动态适应 <VisualStateManager.VisualStateGroups

    4.2K20
    领券