WPF进阶技巧和实战03-控件(3-文本控件及列表控件)

系列文章链接

  • WPF进阶技巧和实战01-小技巧
  • WPF进阶技巧和实战02-布局
  • WPF进阶技巧和实战03-控件(1-控件及内容控件)
  • WPF进阶技巧和实战03-控件(2-特殊容器)
  • WPF进阶技巧和实战03-控件(3-文本控件及列表控件)
  • WPF进阶技巧和实战03-控件(5-列表、树、网格01)
  • WPF进阶技巧和实战03-控件(5-列表、树、网格02)
  • WPF进阶技巧和实战03-控件(5-列表、树、网格03)
  • WPF进阶技巧和实战03-控件(5-列表、树、网格04)
  • WPF进阶技巧和实战04-资源
  • WPF进阶技巧和实战05-样式与行为
  • WPF进阶技巧和实战06-控件模板
  • WPF进阶技巧和实战07--自定义元素01
  • WPF进阶技巧和实战07--自定义元素02
  • WPF进阶技巧和实战08-依赖属性与绑定01
  • WPF进阶技巧和实战08-依赖属性与绑定02
  • WPF进阶技巧和实战08-依赖属性与绑定03
文本控件
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表示的对象。
【WPF进阶技巧和实战03-控件(3-文本控件及列表控件)】ComboBox控件的局限之一在于当使用自动改变尺寸功能时该控件改变自身尺寸的方式。该控件加宽自身以适应它的内容,这意味着当从一项移动到另一项时它会改变自身大小,但没有简便的方法告诉ComboBox控件使用所包含项的最大尺寸。

    推荐阅读