原文:[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口

[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口

周银辉

现象:
大家可以试试下面这个很有趣但会带来Defect的现象:当我们将子窗口按照ShowDialog()的方式显示出来的时候,很明显该窗口是模式化的(即主窗口等待该窗口的返回,主窗口将不相应用户输入),但如果此时将子窗口的Visibility设置成Visibility.Hidden来隐藏窗口,然后再将Visibility设置成Visibility.Visible来再次显示子窗口,此后子窗口便是非模式的了(即主窗口和子窗口一样相应用户输入)

案例:
当用户不操作软件达到一定的时间间隔后,软件会隐藏该软件当前显示的所有窗口,并弹出“锁定窗口”,当用户手动解锁后,“锁定窗口”隐藏,其它所有窗口重新显示出来。

对于上述案例中的窗口,如果使用设置Visibility的方式来显示或隐藏窗口,如果被隐藏的窗口是模式对话框的化,便会在重新显示时出现上述问题。

解决方案:
可以用一个相对简单的方式来解决这个问题:“隐藏” 就是 "看不见”, “把窗口扔到显示屏幕之外”就是“看不见”。(这属于“WO,KAO"类的方案,而非”WOW,SAI“,不过却能很好地工作。”写软件就是骗入“----用高科技骗人的眼睛、耳朵,写游戏就更得会骗人了)

代码:

public class WindowVisibilityHelper : DependencyObject
    {
        public static bool GetIsVisible(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsVisibleProperty);
        }

public static void SetIsVisible(DependencyObject obj, bool value)
        {
            obj.SetValue(IsVisibleProperty, value);
        }

public static readonly DependencyProperty IsVisibleProperty =
            DependencyProperty.RegisterAttached("IsVisible", typeof(bool), 
            typeof(WindowVisibilityHelper), 
            new PropertyMetadata(true, IsVisiblePropertyChangedCallback));

private static void IsVisiblePropertyChangedCallback(DependencyObject obj, 
            DependencyPropertyChangedEventArgs e)
        {
            var window = (Window)obj;
            var visible = (bool)e.NewValue;

if (!visible)
            {
                SetWindowState(window, window.WindowState);
                if (window.WindowState == WindowState.Maximized)
                {
                    window.WindowState = WindowState.Normal;
                }

SetWindowLocation(window, new Point(window.Left, window.Top));
                window.Left = -100000;
                window.Top = -100000;

SetWindowIsShowInTaskBar(window, window.ShowInTaskbar);
                window.ShowInTaskbar = false;
            }
            else
            {
                window.WindowState = GetWindowState(window);

Point loc = GetWindowLocation(window);
                window.Left = loc.X;
                window.Top = loc.Y;

window.ShowInTaskbar = GetWindowIsShowInTaskBar(window);

window.Activate();
                window.BringIntoView();

}
        }

private static Point GetWindowLocation(DependencyObject obj)
        {
            return (Point)obj.GetValue(WindowLocationProperty);
        }

private static void SetWindowLocation(DependencyObject obj, Point value)
        {
            obj.SetValue(WindowLocationProperty, value);
        }

private static readonly DependencyProperty WindowLocationProperty =
            DependencyProperty.RegisterAttached("WindowLocation", typeof(Point), 
            typeof(WindowVisibilityHelper), new UIPropertyMetadata(new Point()));

private static WindowState GetWindowState(DependencyObject obj)
        {
            return (WindowState)obj.GetValue(WindowStateProperty);
        }

private static void SetWindowState(DependencyObject obj, WindowState value)
        {
            obj.SetValue(WindowStateProperty, value);
        }

private static readonly DependencyProperty WindowStateProperty =
            DependencyProperty.RegisterAttached("WindowState", typeof(WindowState), 
            typeof(WindowVisibilityHelper), new UIPropertyMetadata(WindowState.Normal));

private static bool GetWindowIsShowInTaskBar(DependencyObject obj)
        {
            return (bool)obj.GetValue(WindowIsShowInTaskBarProperty);
        }

private static void SetWindowIsShowInTaskBar(DependencyObject obj, bool value)
        {
            obj.SetValue(WindowIsShowInTaskBarProperty, value);
        }

private static readonly DependencyProperty WindowIsShowInTaskBarProperty =
            DependencyProperty.RegisterAttached("WindowIsShowInTaskBar", typeof(bool), 
            typeof(WindowVisibilityHelper), new UIPropertyMetadata(true));

}

[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口相关推荐

  1. 计算机主机省电模式,打开计算机显示屏后即显示省电模式,如何处理

    2442396444 本文适用于HP和Compaq台式计算机使用的HP和Compaq平板显示器. 计算机启动,关闭或进入节能模式时,显示屏上会显示一条消息.显示的信息可能是: 进入睡眠状态(正在进入睡 ...

  2. display none 隐藏后怎么显示_web前端入门到实战:元素显示隐藏的9种思路

    我自己是一名从事了多年开发的web前端老程序员,目前辞职在做自己的web前端私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的web前端学习干货,各种框架都有整理,送给每一位前端小伙伴 ...

  3. display none 隐藏后怎么显示_Web 隐藏技术:几中隐藏 Web 中的元素方法及优缺点

    在 Web 开发中出于多种原因,我们需要隐藏元素.例如,一个按钮应该在移动中可见,而在桌面视口中隐藏.或者,在移动设备上隐藏但要在桌面上显示的导航元素.隐藏元素时有三种不同的状态: 元素完全隐藏并从文 ...

  4. display none 隐藏后怎么显示_display:none与visibility:hidden的区别?

    " 因为平时总是觉得自己不停的修改bug,好记性不如烂笔头,所以把自己每天遇到问题记录下来." 要想知道两者的区别,就要知道他们代表的是什么意思, 其实两者都是对内容进行隐藏的的声 ...

  5. threejs 模型隐藏后不显示_教师资格证面试报名后显示“待审核”?不做这一步报名白费!...

    19下教师资格证面试报名正在进行中,小可爱们都成功报名了吗? 这两天派派为大家回答问题的时候发现很多小可爱被卡在了"待审核"这一步,今天派派就跟大家聊聊"现场审核&quo ...

  6. display none 隐藏后怎么显示_第12天:打破常规之 display

    前面的课程讲解了盒子模型 第10天:撑起CSS布局的半壁江山---盒子模型,盒子的表现形式可以通过 display 这个属性控制,比如让 p 元素变成行内元素,让 span 元素变成块级元素.disp ...

  7. Flutter项目网络图片调试模式正常,打包后不显示(Android)

    --本文介绍的是因为网络权限导致的-- 检查 <项目目录>/android/app/src/main/AndroidManifest.xml 中是否添加了网络权限: <uses-pe ...

  8. SpringBoot项目使用微服务后在Service窗口启动应用后不显示端口号

    问题描述: 解决方案: 将IDEA关闭,在电脑文件管理器地址栏输入:C:\Users\你的用户名\AppData\Local\Temp,将temp文件夹中的数据都删除,重启IDEA即可.

  9. origin坐标轴在隐藏后如何显示

    选中图层(图层的框I被选中) 右键坐标轴 在"轴线和刻度线":标签中勾选"显示轴线和刻度线"即可

最新文章

  1. boost::set_symmetric_difference相关的测试程序
  2. asp功放怎么装_汽车功放怎么安装 汽车功放安装调试方法【详解】
  3. 网页中如何使用一些特殊字体
  4. Android 自定义ViewPager设置屏蔽左右滑动事件
  5. 任务调度-java普通工程通过Timer实现
  6. php模板中的数组在哪,php – Twig:从包含的模板中添加项目到数组
  7. c语言数组插入一个数字 移位,如何将一个数组的元素循环左移?
  8. php验证规则表单,PHP Yii框架之表单验证规则大全
  9. day00 -----博客作业1
  10. android各版本源码下载
  11. 数学建模——stata基础操作
  12. 数据结构导论-1.概述
  13. 利用费马小定理进行素性测试
  14. 硬件工程师-电阻知识大全
  15. NetCore mysql Connection open error . The given key ‘25971‘ was not present in the dictionary
  16. 哈希表构造与处理冲突方法
  17. 计算机安全被动攻击的技术手段,2020年9月网络教育统考《计算机应用基础》计算机安全模拟题试卷3...
  18. Java中xml转义字符和gt,gte,lt,lte缩写
  19. IOT Core-设备接入网关
  20. 天美电竞发布品牌愿景背后:始于电竞,不止于电竞

热门文章

  1. 阿里云企业邮箱收费吗
  2. 项目中常用的 19 条 MySQL 优化总结
  3. Silverlight 控件的验证
  4. docker管理平台 shipyard安装
  5. 加大力度改革 成都公安提高服务金融安防建设能力
  6. 《多处理器编程的艺术》读书笔记(4)--- 自旋锁(1)
  7. 怎么定义list_常用的List接口下集合
  8. AWS — Nitro System
  9. Kubernetes — Pod
  10. OpenStack 实现技术分解 (7) 通用库 — oslo_config