关于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);        

猜你喜欢

转载自www.cnblogs.com/kavilee/p/9284810.html