WPF進階技巧和實戰03-控制元件(3-文字控制元件及列表控制元件)

蝸牛的希望發表於2021-11-02

系列文章連結

文字控制元件

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屬性重寫預設設定,拼寫檢查根據鍵盤配置的輸入語言來決定使用哪個詞典。

PasswordBox

和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

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

ListBox是一個非常靈活的控制元件,它不僅包含ListBoxItem物件,也可以駐留其他任意元素,因為ListBoxItem類繼承自ContentControl類,能夠巢狀內容。ListBoxItem物件會呼叫ToString方法並顯示最終的文字。

ComboBox

ComboBox控制元件和ListBox控制元件類似,該控制元件包含ComboBoxItem物件的集合,既可以顯式地也可以隱式地建立該集合。ComboBox也可以巢狀任何元素的內容控制元件。ComboBox控制元件使用下拉選單,一次只能選擇一項。

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

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

相關文章