[WPF Bug清单]之(6)——Button的IsCancel属性失效
在上一篇中,描述了模态对话框隐藏之后变成了非模态的Bug,很多人回复表示这不算是一个Bug,我也表示理解。Bug只有在需求之下才有意义,不同的需求,对Bug的界定也不一样。作为一个Framework,.NET只能做到在多数时候是符合最广泛群体的需求的,就可以说它合格。但是对于前一篇描述的问题,想补充一下自己的考虑。
Window的Show和ShowDialog,用于将窗体展现(我没有用显示)出来,而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团队与开发团队的沟通还很不充分,比如我在另一篇文章中提到的WPF的Window,没有提供一个属性来设置一个窗体是否显示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)——RadioButton的IsChecked绑定失效
[WPF Bug清单]之(3)——暗中创建文件的打开文件对话框
[WPF Bug清单]之(4)——点击RadioButton的空白没有反应
[WPF Bug清单]之(5)——隐藏模态对话框后变成非模态
[WPF Bug清单]之(7)——顽固的Error Template
[WPF Bug清单]之(8)——RowDefinition中MaxHeight在一定条件下失效
我是MS Fan,但是我依然会以挑剔的眼光看它;只因为我是MS Fan的原因是,从多数开发和娱乐和应用的角度而言,MS是目前最好的选择。如果有一天Linux的哪个发行版在多数方面超过了MS,我会义无反顾地投入Linux。不过是一个平台,不是女友,也不是“知已者”,不需要相守一生。