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

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

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

周银辉

现象:

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

案例:

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

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

解决方案:

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

代码:

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

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

}

原文地址:https://www.cnblogs.com/lonelyxmas/p/9047106.html

时间: 2024-09-28 16:59:15

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

隐藏后重新显示 百度地图 ,地图显示不完整,只显示左上角一小部分

问题描述:我一个DIV1里,放了一个显示百度地图的mapDiv. 问题出现 了, 当初始化(第一次显示DIV1)时 ,可以 正常显示 地图, 当隐藏后 再 显示 时, 地图就 出错了,地图显示不完整,只显示左上角一小部分. jsp代码: <!-- 显示地图,获取经纬度    start --> <div id="mapModel" class="modal  fade " tabindex="-1" role="dia

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

是这样的,app首页头部可能要自定义,所以选择把NavigationBar隐藏,所以在viewWillAppear时这样写: self.navigationController?.setNavigationBarHidden(true, animated: false) 又在push出来的控制器里写上了: self.navigationController?.setNavigationBarHidden(false, animated: false) 这时候在View2返回View1时会发现头部

Swiper隐藏后在显示滑动问题

<div class="labs" style="display:none"> <div class="swiper-wrapper"> {{each $data.result}} <div class="swiper-slide"> <ul class="cf"> {{each $value x}} <li class="fl table&q

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

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

解决浏览器窗口变小后右侧出现空白背景颜色或者图片不能全屏填充的方法

在做全屏网页的时候会出现这样的情况: 窗口最大化显示时正常,当缩小窗口时,出现了滚动条,将滚动条拖动到右侧就会出现空白,背景颜色都不显示但是元素还在例如下图: 全屏显示正常的,然后把窗口缩小 就会出现这样的效果,解决办法就是给body加一个最小高度,至于数值大小取决于网页的基本宽度,或者就是你导航元素占据的宽度(不是背景),就以此网页为例,网页主体1200px那么就在css中添加最小高度 body{ min-height:1200px; } 然后问题就解决了

模式对话框与非模式对话框的区别

模式对话框就是不处理它就没法处理父窗口,而非模式对话框就是不用先处理此对话框也可以处理父窗口.例子:在桌面上右击我的电脑,选择属性,弹出系 统属性窗口,点击下面的技术支持,弹出技术支持信息,现在再对系统属性窗口进行操作就操作不了,这种叫做模式对话框;关闭技术支持信息,在系统属性里选择 硬件,点击设备管理器,弹出设备管理器窗口,现在再对系统属性窗口进行操作仍然可以操作,这种就叫做非模式对话框. 在WIN32中,模式对话框的创建一般是使用DialogBox来进行创建的.而非模式对话框则是利用Crea

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

div的visibility可以控制div的显示和隐藏,但是隐藏后页面显示空白 style="visibility: none;" document.getElementById("typediv1").style.visibility="hidden";//隐藏 document.getElementById("typediv1").style.visibility="visible";//显示 通过设置

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

转载:http://www.cnblogs.com/zhouyinhui/archive/2008/11/04/1326188.html WPF窗口最大化时有个很不好的现象是:如果窗口的WindowStyle被直接或间接地设置为None后(比如很多情况下你会覆盖默认的窗体样式,即不采用Windows默认的边框和最大化最等按钮,来打造个性的窗体),那么最大化窗口后,窗口将铺满整个屏幕而将任务栏盖住.这往往不符合实际要求. 这里有个不错的解决方案解决了该问题,其通过对 WM_GETMINMAXINF

WPF窗口贴边隐藏(类似QQ)

public partial class MainWindow : Window    {        #region 窗口贴边隐藏用的变量        //鼠标坐标当前位置        private MousePosition p = new MousePosition();        MousePosition.POINT point; //窗口贴边隐藏用的变量        private bool isHidd = false;        public double Cu