天天看點

WPF進階技巧和實戰03-控件(3-文本控件及清單控件)

WPF提供了3種用于輸入的文本控件:TextBox、RichTextBox和PasswordBox。前兩種繼承自TextBoxBase類,最後一個繼承自Control類。文本框能夠包含的内容類型是有限的。TextBox控件總是存儲字元串(Text屬性),PasswordBox控件也處理字元串内容(Password屬性)。隻有RichTextBox控件可以存儲更複雜的内容(可包含複雜元素組合的FlowDocument對象)

TextBox控件通常存儲單行文本(可以通過設定MaxLength屬性來限制字元的數量)。有些情況下需要處理大量内容,也就要使用多行文本框。TextWrapping屬性設定為Wrap或者WrapWithOverflow,如果是前者,總是會在控件的邊緣換行,甚至将一個特别長的單詞放在兩行中。如果是後者,換行算法在沒有發現合适的位置(空格或者連字元)進行換行,就允許拉伸某些行使其超出右邊緣。

為了能自動在文本框中看到多行文本,需将其尺寸設定的足夠大。不應該設定寫死的高度(這樣不能适應不同的字型大小,而且可能導緻布局問題),可使用友善的MinLines和MaxLines屬性,分别設定文本框中必須顯示的最小行數和能夠顯示的最大行數。

如果文本框支援換行,使用者可輸入更多能夠立即在可視行中顯示的文本。是以通過将VerticalScrollBarVisibility屬性設定為Visible或者Auto,添加始終顯示或按需顯示的滾動條是有意義的。如果允許在使用者在多行文本框中通過Enter輸入回車,需要将AcceptsReturn屬性設定為true。也可以通過設定AcceptsTabs屬性,允許使用者輸入Tab鍵。TextBox還提供了幾個方法,通過這些方法可使用代碼以較小或者較大的步長在文本内容中移動。LineUp,LineDown,PageUp,PageDown,ScrollToHome,ScrollToEnd,ScrollToLine。

如果是為了顯示文本的文本框,這時可以使用IsReadOnly屬性設定為true以阻止編輯文本。最好通過IsEnabled屬性設定為false來禁用文本框,會顯示灰色的文本,不支援文本選擇和複制,滾動。

任何文本框都可以通過滑鼠單擊并拖動滑鼠,或者按住shift鍵并使用方向鍵在文本中移動來選擇文本。TextBox類還提供了使用SelectionStart、SelectionLength以及SelectedText屬性,通過程式設計決定選擇哪些文本或改變目前所選文本的能力。

SelectionStart屬性确定所選文本的開始位置,該位置從0開始。SelectionLength屬性訓示選中的字元的總數量,0表示未選中字元。SelectedText屬性可快速檢查或者改變在文本框中選中的文本。可以通過處理SelectionChanged事件對文本選擇變化加以響應。還提供了控制文本選擇行為的屬性AutoWorldSelection,如果為true,那麼當在文本中拖動滑鼠時文本框每次會選擇整個單詞。

文本框有Undo功能,允許使用者撤銷最近的操作。隻要未将CanUndo屬性設定為false,就可以通過代碼擷取Undo功能,調用此方法,并使用Ctrl+Z快捷鍵。

TextBox還支援拼寫檢查,隻需要将SpellCheck.IsEnabled依賴項屬性設定為true即可。目前隻局限于4中語言:英語、法語、德語、西班牙語。可通過TextBox控件的Language屬性重寫預設設定,拼寫檢查根據鍵盤配置的輸入語言來決定使用哪個詞典。

和TextBox類似,但是通過顯示圓圈符号字元串來屏蔽實際字元(可以通過設定PasswordChar屬性選擇不同的屏蔽字元),不支援剪切闆,不能複制内部文本。

提供了MaxLength屬性,Clear(), Paste(), SelectAll() 方法,文本發生變化時觸發PasswordChanged時間。

主要包含ListBox、ComboBox,以及ListView、TreeView、ToolBar控件。這些控件都繼承自ItemsControl類。ItemsControl類添加了所有基于清單的控件都是用的基本功能。最顯著的是,提供了填充清單的兩種方式。最直接的辦法是使用代碼或者XAML将清單項直接添加到Items集合中。使用資料綁定的形式,需要将ItemsSource屬性設定為希望顯示的具有資料項集合的對象。

ItemsControl類之後繼承有一些混亂,一個主要分支是選擇器Selector,包括ListBox、ComboBox以及TabControl,這些控件都繼承自Selector類,都具有跟蹤目前選擇項SelectItem或者選擇位置SelectIndex的屬性。另一個分支以不同方式選擇清單項,主要包括菜單、工具欄、樹。

ListBox代表了最常用的清單項,允許使用者選擇其中一項。可以通過SelectionMode屬性設定選擇模式,Multiple(通過單擊項進行選擇或者取消選擇)、Extended(需要按下Ctrl鍵選擇其他項,或者按下Shift鍵選擇某個範圍)、Single(預設單選),可以通過SelectedItems集合或者SelectedItem屬性來擷取所有選擇項。

ListBox是一個非常靈活的控件,它不僅包含ListBoxItem對象,也可以駐留其他任意元素,因為ListBoxItem類繼承自ContentControl類,能夠嵌套内容。ListBoxItem對象會調用ToString方法并顯示最終的文本。

ComboBox控件和ListBox控件類似,該控件包含ComboBoxItem對象的集合,既可以顯式地也可以隐式地建立該集合。ComboBox也可以嵌套任何元素的内容控件。ComboBox控件使用下拉清單,一次隻能選擇一項。

如果希望允許使用者在組合框中通過輸入文本選擇一項,就必須将IsEditable屬性設定為true,并且比偶徐確定選項集合中存儲的是普通的純文字的ComboBoxItem對象,或是提供有意義的ToString表示的對象。

ComboBox控件的局限之一在于當使用自動改變尺寸功能時該控件改變自身尺寸的方式。該控件加寬自身以适應它的内容,這意味着當從一項移動到另一項時它會改變自身大小,但沒有簡便的方法告訴ComboBox控件使用所包含項的最大尺寸。