zoukankan      html  css  js  c++  java
  • 关于WPF的弹出窗口

    几个重要的概念需要清楚:

    Show和ShowDialog区别

    1、调用Show方法后弹出子窗口后,线程会继续往下执行。调用ShowDialog方法弹出子窗口后,线程会阻塞,直到子窗口关闭才继续往下执行。

    2、ShowDialog弹出的子窗口会使父窗口不能获得焦点,必须先关闭子窗口才能关闭父窗口。Show则不会。

    3、在ShowDialog弹出的子窗口中设置DialogResult会关闭子窗口,父窗口可根据DialogResult的值做不同响应。

    Owner

     当设置了Owner,不管是点击任务栏切换还是TAB切换,子窗口都将永远保持在父窗口上层(最符合使用习惯)。

    如果不设置子窗口的Owner,就可能发生子窗口被父窗口遮挡,并且父窗口无法点击的严重BUG,所以弹出窗口时应该要首先设置子窗口的Owner属性。

    PS:不能将所有的窗口Owner都设置为App.Current.MainWindow,因为如果是第三级弹出子窗口,那么点击第二级子窗口时,第三级子窗口也会被遮挡。

    Topmost

    当Topmost=true时,窗口会置于桌面的最顶层,本软件的所有的窗口或其它软件的窗口都会被该窗口遮挡(这显然是不合理的)。

    所以,如果不是特殊需要,千万不要把Topmost设置为true。

    ShowInTaskbar

    默认为true,当设置为false的时候在任务栏看不到该窗口。

    总结

    因为WPF默认只有一个不带参的ShowDialog方法,为了防止弹出子窗口时忘记设置Owner属性,我们可以添加一个带参数的扩展方法。

    扩展方法:

        public static class DialogHelper
        {
            public static bool? ShowDialog(this Window win, Window owner)
            {
                win.Owner = owner;
                win.ShowInTaskbar = false;
                return win.ShowDialog();
            }
        }

     调用:

                var win = new WinA(); 
                win.ShowDialog(this);        
  • 相关阅读:
    汉诺塔问题
    Java中的int类型取值范围
    unsigned 类型
    CharBuffer
    铺地砖问题(递归)
    汉诺塔简略
    Long类型的构造方法被遗弃,代替的是valueOf
    坏掉的项链
    挤牛奶
    修理牛棚
  • 原文地址:https://www.cnblogs.com/kavilee/p/9284810.html
Copyright © 2011-2022 走看看