·Button
·RepeatButton
·ToggleButton
·CheckBox
·RadioButton
1.Button
WPF 的按钮类只在ButtonBase 现有基础上加了个简单的概念:是一个取消按钮还是一个默认按钮。这
种机制对于对话框来说是一种捷径。如果对话框上一个按钮的Button.IsCancel 被设置成了True,你点击了
那个按钮,这个对话框会自动关闭。如果Button.IsDefault 被设置成了true,除非焦点不在这个按钮上,否
则按回车就会触发这个按钮的Click 事件。
按钮控件的IsDefault 和IsDefaulted 属性有什么差别?
IsDefault 属性是一种可读写属性,可以决定按钮是否应该是默认的。IsDefaulted 名字取得比较烂,它是
只读属性,表示按钮的某一状态,比如按回车键会使它处于点击状态。换句话说,当IsDefault 是true 的时
候,IsDefaulted 只能是true,并且不管是默认按钮还是TextBox(同时AcceptsReturn 被设为false)获得了
焦点。这个特性使得你可以通过按回车键来触发默认按钮的点击事件,即使这时焦点在TextBox 上。
如何才能以编程方式点击一个按钮?
按钮和其他WPF 控件一样,有一个属于System.Windows.Automation.Peers 命名空间的peer 类来支持
UI Automat ion:ButtonAutomat ionPeer,可以这样使用它:
4
UI Automat ion 类有许多对于自动测试相当有用的成员。
2.RepeatButton
RepeatButton 的行为基本和Button 一样,除了它会在按钮一直被按着的情况下触发点击事件(它没有
Button 的取消和默认这两种行为,因为它直接继承自ButtonBase)。产生点击事件的频率主要由RepeatButton
的Delay 以及Interval 这两个属性的值决定;这两个属性的默认值分别是SystemParameters.KeyboardDelay
以及SystemParameters.KeyboardSpeed。默认情况下,Repeat- Button 看起来和Button 一样(如图4-1 所示)。
RepeatButton 的行为乍听起来很奇怪,其实它对于计算一段时间内某个按钮被按次数的增减统计是非常
有用的。例如,当用鼠标点在上面,保持长时间不释放时,滚动条底下的那个按钮就可以展示被重复按下
的行为,或者你在做一个数字的“上下”控件(WPF 没有内建这种控件),你会使用两个RepeatButton 去控
制数字的大小。RepeatButton 属于System.Windows.Controls.- Primit ives 命名空间,你应该会把它和其他成
熟的控件一起使用,而不是单独使用它。
3.ToggleButton
ToggleButton 是一种在点击时可以保留其状态的“粘性”按钮(它也没有Button 控件的取消行为以及默
认行为)。第1 次点击它的时候,IsChecked 属性会被设为true;再点击一次,就被设为了false。ToggleButton
的默认外观和Button 以及RepeatButton 完全一样。
ToggleButton 还有一个IsThreeState 属性,如果把它设为true 的话,IsChecked 就会有3 种值:true、false
或者null。事实上,IsChecked 是Nullable<Boolean>类型的。第1 次点击ToggleButton 会把IsChecked 设为
true,第2 次则把它设为null,第3 次把它设为false,依此类推。
除了IsChecked 属性以外,ToggleButton 分别为每一个IsChecked 的值定义了不同的事件:true 对应
Checked 事件,false 对应Unchecked 事件,null 对应Indeterminate 事件。ToggleButton 没有单独的
IsCheckedChanged 事件似乎很奇怪,但是3 种不同的事件便于声明。
和RepeatButton 一样,ToggleButton 也属于System.Windows.Controls.Primitives 命名空间,这意味着
WPF 的设计器并不期望用户在没有额外定制的情况下直接使用ToggleButton。这个设想很自然,但在后面
的章节里你会看到,如何在一个ToolBar 里直接使用ToggleButton。
4.CheckBox
CheckBox 是一种常见的控件,如图4-2 所示。但是请等一下……这一节难道不是在讨论按钮控件吗?
没错,不过请先想一下WPF CheckBox 的特性:
·它拥有由外部提供的内容(所以不算标准的复选框)。
5
·它可以区分是被鼠标点击还是被键盘点击。
·它可以在被点击时记录选中(checked)或者未选中(unchecked)状态。
·它支持3 种状态模式,分别为选中(checked)、不确定(indeterminate)、未选中(unche- cked)。
听起来觉得似曾相识吗?应该很熟悉吧,因为CheckBox 和ToggleButton 只有外观上的差别!CheckBox
除了在继承ToggleButton 时重写了控件默认样式以及视觉外观以外,其他都与ToggleButton 完全一样,如
图4-2 所示。
图4-2 WPF CheckBox
5.RadioButton
RadioButton 是另一种从ToggleButton 继承过来的控件,但它的特殊在于支持互斥性。当多个RadioButton
被放在一个组里,一次只有一个可以被选中,把一个RadioButton 选中就会自动把组中其他所有的
RadioButton 设为不选中。事实上,用户不能直接通过选中RadioButton 来取消对它本身的选中,这一动作
只能通过编程方式来完成。因此,RadioButton 是为多项选择所设计的。RadioButton 的默认外观如图4-3 所
示。
图4-3 WPF RadioButton
把几个WPF RadioButton 放在同一组里是非常直观的。默认情况下,任何RadioButton 被自动分成一个
组,共享同一个逻辑父元素。比如,以下几个RadioButton 一次只有一个可以被选中:
如果需要用自定义的方法对RadioButton 作分组,那么可以用它的GroupName 属性,这个属性是字符
串类型的,任何拥有相同GroupName 的RadioButton 会被分在同个组里(只要它们在逻辑上属于同一个源)。
因此可以把属于不同父元素的RadioButton 放在一个组中: