[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口
原文:[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疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口的更多相关文章
- 隐藏bat脚本运行时弹出的黑窗口,以隐藏进程在后台执行.
1.把这段代码写在前面@echo offif "%1"=="r" goto startif "%1"=="h" goto ...
- NavigationBar隐藏后,返回时表现不完美
是这样的,app首页头部可能要自定义,所以选择把NavigationBar隐藏,所以在viewWillAppear时这样写: self.navigationController?.setNavigat ...
- Sublime Text 3菜单栏隐藏后怎么显示
Sublime Text 3如何显示菜单栏 今天在使用Sublime Text 3敲代码的时候不小心就把上侧的菜单栏隐藏了,自己鼓捣了半天才把菜单栏弄出来,下面我就给大家讲解一下我是如何操作的 键盘按 ...
- Html 使用技巧 -- 设置display属性可以使div隐藏后释放占用的页面空间
div的visibility可以控制div的显示和隐藏,但是隐藏后页面显示空白: style="visibility: none;" document.getElemen ...
- 利用JS做到隐藏div和显示div
div的visibility可以控制div的显示和隐藏,但是隐藏后页面显示空白 style="visibility: none;" document.getElementById( ...
- [WPF疑难] 继承自定义窗口
原文 [WPF疑难] 继承自定义窗口 [WPF疑难] 继承自定义窗口 周银辉 项目中有不少的弹出窗口,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于Window自身的,但每个弹出框 ...
- [WPF疑难]避免窗口最大化时遮盖任务栏
原文 [WPF疑难]避免窗口最大化时遮盖任务栏 [WPF疑难]避免窗口最大化时遮盖任务栏 周银辉 WPF窗口最大化时有个很不好的现象是:如果窗口的WindowStyle被直接或间接地设置为None后( ...
- [WPF疑难]ErrorTemplate显示与隐藏问题
原文:[WPF疑难]ErrorTemplate显示与隐藏问题 [WPF疑难]ErrorTemplate显示与隐藏问题 周 ...
- [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu)
原文 [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu) [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu) 周银辉 点击窗口左上角图标时弹出来的菜单也就是这里所说的系 ...
随机推荐
- 文件流结尾的EOF详解
我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file) ...
- Methods and systems to control virtual machines
Methods and systems are provided to control the execution of a virtual machine (VM). A VM Monitor (V ...
- Thermally driven workload scheduling in a heterogeneous multi-processor system on a chip
Various embodiments of methods and systems for thermally aware scheduling of workloads in a portable ...
- 【SSH2(理论+实践)】--图说Struts2的执行
前几篇文章讨论了有关Struts2的核心机制及一些基础,但同一时候也遗留下了非常多问题.这些问题主要是针对Struts2的一些使用技巧的,该篇文章将会针对Struts2的使用技巧进行讨论, ...
- XMPP之ios即时通讯客户端开发-mac上搭建openfire服务器(二)
come from:http://www.cnblogs.com/xiaodao/archive/2013/04/05/3000554.html 一.下载并安装openfire 1.到http://w ...
- markdown模式的一些语法
Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 简书支持程序员写技术博客的模式,Markdown具有一系列衍生版本,用于扩展Mar ...
- asp.net中c#求百分比
double m= 50;double n= 100; Response.Write((m/ (m+ n)).ToString("0%"));Response.Write((m/ ...
- STL序列容器之deque
一,deque的基础知识 1.deque的基础 deque是“double-ended-queue”的缩写,意思是双端队列,其和vector的区别在于vector是单端的. deque在头部和尾部插入 ...
- AVL 树的插入、删除、旋转归纳
参考链接: http://blog.csdn.net/gabriel1026/article/details/6311339 1126号注:先前有一个概念搞混了: 节点的深度 Depth 是指从根 ...
- Leetcode 136 Single Number 亦或
题意就是从一堆数中找出唯一的一个只存在一个的数.除了那个数,其他的数都是两个相同的数. 通过亦或的性质: 1)a^a = 0 0^a = a 2)交换律 a^b = b^ a 3)结合律 (a^b)^ ...