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

title author date CreateTime categories
WPF 解决弹出模态窗口关闭后,主窗口不在最前
lindexi
2019-06-23 11:48:38 +0800
2018-2-13 17:23:3 +0800
WPF

本文告诉大家如何解决这个问题,在 WPF 的软件,弹出一个模态窗口。使用另一个窗口在模态窗口前面。从任务栏打开模态窗口。关闭模态窗口。这时发现,主窗口会在刚才使用的另一个窗口下面。

这是 Windows 的bug ,不过从上面的描述,也许大家还不知道这个问题是什么。不过我把他放在 github ,所以大家可以看到这个问题具体是什么。

可以运行代码:wpf-issues/ChildWindows

在上面的网站有详细的视频告诉大家是如何做的就可以看到这个问题。

因为模态窗口会在关闭的时候,让主窗口不在最前,所以团队不敢使用模态窗口。

但是这个问题在看了 Windows 历史之后,才发现这个问题是 Windows 的问题。在窗口关闭的时候,Windows 会找一个在这个窗口下方的第一个可用的窗口,激活他。因为弹出模态窗口的主窗口是被禁用的。所以在模态窗口关闭的时候,就忽略了主窗口可以激活,于是找到主窗口下方的一个可以被激活的窗口,这时激活他,于是这个被找到的窗口就在主窗口的上面。

那么这个问题可以如何解决?实际上只需要在模态窗口关闭之前,激活主窗口就可以。请看下面的代码

     private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            var w = new Window
            {
                Title = "ChildWindow",
                Owner = this,
                Width = 600,
                Height = 500,
                Content = "Step 1: Move a window of another appliation to over the MainWindow\r\n" +
                          "Step 2: Active this window from the Windows taskbar\r\n" +
                          "Step 3: Close this window (ChildWindow)\r\n" +
                          "\r\nNow you can see that the MainWindow drops down and coverd by another window.\r\n" +
                          "If you don't understand the description above, please refer to the video demo in this project."
            };
            w.Closing += W_Closed;
            w.Show();
        }

        private void W_Closed(object sender, CancelEventArgs e)
        {
            Activate();
        }

解决的项目我传到 CSDN,可以直接运行。

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

posted @   lindexi  阅读(118)  评论(0编辑  收藏  举报
编辑推荐:
· 自定义通信协议——实现零拷贝文件传输
· Brainfly: 用 C# 类型系统构建 Brainfuck 编译器
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
阅读排行:
· DeepSeek 全面指南,95% 的人都不知道的9个技巧(建议收藏)
· 自定义Ollama安装路径
· 本地部署DeepSeek
· 快速入门 DeepSeek-R1 大模型
· DeepSeekV3+Roo Code,智能编码好助手
点击右上角即可分享
微信分享提示