[WPF Bug清单]之(6)——Button的IsCancel属性失效

 

上一篇中,描述了模态对话框隐藏之后变成了非模态的Bug,很多人回复表示这不算是一个Bug,我也表示理解。Bug只有在需求之下才有意义,不同的需求,对Bug的界定也不一样。作为一个Framework.NET只能做到在多数时候是符合最广泛群体的需求的,就可以说它合格。但是对于前一篇描述的问题,想补充一下自己的考虑。

WindowShowShowDialog,用于将窗体展现(我没有用显示)出来,而Close用于关闭。Close之后就不能再用Show或是ShowDialog再次将窗体展现出来,否则会抛出异常,所以5楼的gboxcc回复的是错的。很同情这位gboxcc,因为他认为我说错的那句,恰恰是我写过代码验证过的。

如果想隐藏而不关闭一个窗体,显然用Close是不行的。而且还要把所有的Close事件Cancel掉,保证窗体不会被Close,然后只能用Visibility 将窗体隐藏起来。隐藏之后,如果要将窗体再次显示出来,我的第一感觉是用Visibility,但是发现不行。

从这个角度而言,Window类,Show/Close只在开始和结束的时候调用,因为它们不能交替调用;在窗体Show之后,用Visibility控制其可见性,因为可见性可以随意交替设置的。我认为这才是一个非常自然的事情。但是Window的实际情况是,Visibility的设置,会使isShowingDialog变量的值发生变化,单从需求上讲,这是不应该的。所以将其做为一个Bug提了出来。Colin Han认为这是“为了更好地用户体验,专门做出的设计。”,我亦不以为然。而且我感觉微软的UX团队与开发团队的沟通还很不充分,比如我在另一篇文章中提到的WPFWindow,没有提供一个属性来设置一个窗体是否显示Icon,这本身就不符合微软自己的UX Guide

回复的人一致认为,再次显示这个窗体时也应该用ShowDialog。好,这篇文章就是为次而生的。因为用ShowDialog将窗体再次显示出来同样有问题。连代码都不用改,直接用上次的代码就可以重现这个问题。使用ShowDialog方法将一个窗体再次显示出来之后,窗体上的”Hide Self”按钮失效了。注意是再次,第一次ShowDialog出来时的行为是正常的。

这里顺便介绍一下IsCancel属性,MSDN上对它的解释如下:获取或设置一个,该值指示Button是否是一个“取消”按钮。用户可以通过按ESC键激活“取消”按钮。其实我感觉这句话对于新手而言实在是没有什么帮助。好像就告诉别人这个属性就是给Button加了个ESC键作为快捷键。必须要和MSDN上的很多文档合起来看才知道这个IsCancel按钮在不同环境下分别起什么作用,其实还不如自己写个代码试一下来得方便。

对于示例中的代码而言,IsCancel就相当于让当前窗体关闭。这是给窗体添加一个关闭按钮最简单的方式(没有之一)。因为这个Bug用的就是上一篇的代码。所以就不给大家贴图了。自己运行一下吧。逻辑如下:

1.       点击示例中的Show Model Dialog按钮——显示一个模态对话框。

2.       可以用Hide Self关闭弹出框。

3.       再用Show Model Dialog弹出这个对话框。

4.       那个Hide Self按钮不再起作用了。

同系列的其它文章:

[WPF Bug清单]()与之(1)——可以多选的单选ListBox

[WPF Bug清单](2)——RadioButtonIsChecked绑定失效

[WPF Bug清单](3)——暗中创建文件的打开文件对话框

[WPF Bug清单](4)——点击RadioButton的空白没有反应

[WPF Bug清单](5)——隐藏模态对话框后变成非模态

[WPF Bug清单](7)——顽固的Error Template

[WPF Bug清单](8)——RowDefinitionMaxHeight在一定条件下失效

[WPF Bug清单](9)——消失的光标

我是MS Fan,但是我依然会以挑剔的眼光看它;只因为我是MS Fan的原因是,从多数开发和娱乐和应用的角度而言,MS是目前最好的选择。如果有一天Linux的哪个发行版在多数方面超过了MS,我会义无反顾地投入Linux。不过是一个平台,不是女友,也不是“知已者”,不需要相守一生。

原文地址:https://www.cnblogs.com/nankezhishi/p/WPFBug6.html