·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 放在一個組中:
