原文:[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 = -;
                window.Top = -;                 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. 隐藏bat脚本运行时弹出的黑窗口,以隐藏进程在后台执行.

    1.把这段代码写在前面@echo offif "%1"=="r" goto startif "%1"=="h" goto ...

  2. NavigationBar隐藏后,返回时表现不完美

    是这样的,app首页头部可能要自定义,所以选择把NavigationBar隐藏,所以在viewWillAppear时这样写: self.navigationController?.setNavigat ...

  3. Sublime Text 3菜单栏隐藏后怎么显示

    Sublime Text 3如何显示菜单栏 今天在使用Sublime Text 3敲代码的时候不小心就把上侧的菜单栏隐藏了,自己鼓捣了半天才把菜单栏弄出来,下面我就给大家讲解一下我是如何操作的 键盘按 ...

  4. Html 使用技巧 -- 设置display属性可以使div隐藏后释放占用的页面空间

         div的visibility可以控制div的显示和隐藏,但是隐藏后页面显示空白: style="visibility: none;" document.getElemen ...

  5. 利用JS做到隐藏div和显示div

    div的visibility可以控制div的显示和隐藏,但是隐藏后页面显示空白 style="visibility: none;" document.getElementById( ...

  6. [WPF疑难] 继承自定义窗口

    原文 [WPF疑难] 继承自定义窗口 [WPF疑难] 继承自定义窗口 周银辉 项目中有不少的弹出窗口,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于Window自身的,但每个弹出框 ...

  7. [WPF疑难]避免窗口最大化时遮盖任务栏

    原文 [WPF疑难]避免窗口最大化时遮盖任务栏 [WPF疑难]避免窗口最大化时遮盖任务栏 周银辉 WPF窗口最大化时有个很不好的现象是:如果窗口的WindowStyle被直接或间接地设置为None后( ...

  8. [WPF疑难]ErrorTemplate显示与隐藏问题

    原文:[WPF疑难]ErrorTemplate显示与隐藏问题 [WPF疑难]ErrorTemplate显示与隐藏问题                                         周 ...

  9. [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu)

    原文 [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu) [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu) 周银辉 点击窗口左上角图标时弹出来的菜单也就是这里所说的系 ...

随机推荐

  1. 浅谈python字符串存储形式

    http://blog.csdn.net/zhonghuan1992 钟桓 2014年8月31日 浅谈python字符串存储形式 记录一下自己今的天发现疑问而且给出自己现有知识有的回答. 长话短说,用 ...

  2. Android Thread.setDaemon设置说明

    Thread.setDaemon的用法,经过学习以后了解: 1. setDaemon需要在start方法调用之前使用 2. 线程划分为用户线程和后台(daemon)进程,setDaemon将线程设置为 ...

  3. react渲染和diff算法

    1.生成虚拟dom createElement的作用就是生成虚拟dom.虚拟dom到底是个啥,其实它就是个javascript对象~,这个对象的属性有props,vType,type, 而props也 ...

  4. phpstorm常用快捷键有哪些(图解归类)

    phpstorm常用快捷键有哪些(图解归类) 一.总结 一句话总结: 10.方法参数提示,显示默认参数   解答:--------CTRL+P 13.显示类层级关系图,继承/实现关系   解答:--- ...

  5. Linux非图形界面安装程序

    安装Linux程序的时候一般不会调取图形界面,这样输错内容,返回上一步时需要使用命令 previous ,相应的exit 与 next..在中文操作的时候,不会提示,所以要记住 在安装过程中,我们可能 ...

  6. 数组[0]和[firstobject]的区别

    数组[0]和[firstobject]的区别   [0]:数组为空时回报错 [firstobject]:数组为空时回返回nil

  7. QT类库与Delphi VCL类库的体系结构对比——两者十分类似!

    今天在看QT对象内存管理的一篇文章时:http://blog.csdn.net/dbzhang800/article/details/6300025想到了一个问题:就是QT类库体系结构与Delphi类 ...

  8. 【codeforces 776A】A Serial Killer

    [题目链接]:http://codeforces.com/contest/776/problem/A [题意] 这个杀手每天会除掉一个人; 这个杀手每天都有两个目标; 给你它杀人的日志,以及这个人被杀 ...

  9. 【codeforces 791D】 Bear and Tree Jumps

    [题目链接]:http://codeforces.com/contest/791/problem/D [题意] 你可以从树上的节点一次最多走k条边. (称为跳一次); 树为无权树; 然后问你任意两点之 ...

  10. idhttp post 出现exception class EIdSocketError with message 'Socket Error # 10054的解决办法(捕捉异常,防止程序挂掉)

    由于项目需要.需要向一个地址提交数据.提交的次数很频繁,但是程序经常raised exception class EIdSocketError with message 'Socket Error # ...