• WPF,Silverlight与XAML读书笔记第二十三 控件之五 – Items控件(选择器控件)


    说明:本系列基本上是《WPF揭秘》的读书笔记。在结构安排与文章内容上参照《WPF揭秘》的编排,对内容进行了总结并加入一些个人理解。

    选择器(Selector)

    选择器中的Item在被索引的基础上又可以被选择,由控件关系图可以看出Selector继承自ItemControl。

    Selector的属性:

    • SelectedIndex:非负的整数,表示被选中的Item。如果没有项被选择,则用属性值为-1表示。Index值是按其被加入SelectedItem的顺序决定的。
    • SelectedItem:当前被选中的Item。
    • SelectedValue:当前被选中的Item的值。

    默认情况下,这个值是Item本身,即SelectedValue与SelectedItem是一样的。通过设置SelectedValuePath可以选择任意属性,来表示Item的SelectedValue值。(SelectedValuePath与DisplayMemberPath工作原理一样。)

    以上3个属性都是可读可写的,可以使用它们得到当前选择,也可以设置这些值来改变选择。

    Selector的附加属性:

    • Selector定义了以下两个附加属性,可以将其应用到Item上。
    • IsSelected属性:用来获得一个项被选中的状态(布尔值)
    • IsSelectionActive:布尔值表示选择的值是否拥有焦点。

    Selector的事件:

    • SelectionChanged:当选择的内容改变时触发。

    下面介绍的控件都是继承自Selector的控件。

    ComboBox (WPF1.0)

    这是一种很常见的控件,允许用户由列表中选择一个Item(可以使用鼠标,或通过Alt+Up,Alt+Down或F4键来打开或关闭这个列表框。)

    ComboBox的成员:

    与开关相关的成员:

    • IsDropDownOpen属性:表示下拉列表是打开或关闭的状态,这是可读可写的属性,改变其可以影响下拉列表的状态。
    • DropDownOpened与DropDownClosed事件:在列表打开或关闭时触发的事件。比如你可以处理DropDownOpened实现在列表打开时再填充它。

    与选择框类型相关成员:

    • IsEditable属性:在为true时,ComboBox的选择框变为一个文本框。(这个文本框允许用户输入文字,如果文字与现存的Item一样,这个Item就会自动被选中。否则没有Item会被选中,但是这个输入的文字会被存储在ComboBox的Text属性中,并可以操作它。)
    • StayOpenOnEdit属性:如果希望在编辑时列表仍然打开,则将此属性设置为True。
    • IsReadingOnly属性:这个属性只有在IsEditable为true时才能发挥其作用。当其为false时,文本框允许输入值,为true时文本框只读,并以文本方式显示这个item。(注意内容需要是可以作为文本显示的,如果内容是不能被作为字符串显示的,则将显示其命名空间与类的名称。要想更改这个显示,见下文)

    TextSearch类

        这个类定义了两个附加属性,其可以控制在一个可编辑的选择框里显示的文本。

    TextSearch.TextPath属性:用于附加到ComboBox上,其指示可以将项的属性(或子属性)值作为选择框的文字使用。(TextPath这个属性也与DisplayMemberPath以及SelectedValuePath属性类似)

    TextSearch.Text属性:这个属性被应用到ComboBox的某个Item上,因此更灵活一些(TextPath属性定义的值必须要求所有Item有相同的属性,一旦没有,这个没有此属性的Item将显示为空字符串。Text属性被直接设置为要在文本框中显示的文本)

    Text属性会重写TextPath设置的值。

     

    在SelectionChanged的事件处理程序中取得改变后的选择项。这个问题的关键是给事件处理程序传入的SelectionChangedEventArgs类型的参数。此参数包含两个IList类型的属性:

    AddItems和RemovedItems:AddItems包含新的选择,RemovedItem包含老的选择。(SelectionChanged应用范围广泛,其能处理多项选择,所以对于ComboBox这类只能单选的控件,注意程序中要只取一项:C#示例)

    1 private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    2 {
    3     if(e.AddedItems.Count > 0)
    4         object newSelection = e.AddedItems[0];
    5 }
     

    内幕一:ComboBoxItem

    ComboBox隐式把每项包装在ComboBoxItem对象中。当然也可以显示把<ComboBoxItem>写起来。显示写出<ComboBoxItem>后,还需要TextSearch.Text属性(如果存在)移到<ComboBoxItem>中。(由前文可知<ComoboBoxItem>是一种内容控件。

    为什么要使用ComboBoxItem

    ComboBoxItem可以避免当IsEditable为false时,在选择框中显示内容控件的行为。

    ComboBoxItem有用的属性:IsSelected与IsHighlighted,有用的事件Selected与Unselected。这些方法很简单,根据名称就可以看出它们的作用。

    ListBox控件 (WPF1.0/Silverlight2.0)

    ListBox将其所有的项直接在控件的边界以内显示,主要的使用范围是一组有序的列表。

    ListBox的属性:

    • SelectionMode属性:这个重要属性使ListBox可以支持同时发生的选择操作。这个属性可以接受SelectionMode枚举的3个值,如下:

      Single – 这是默认值,一次只能选择一项。

      Mulle – 可以同时选择任何数目的项,点击一个未选中的项将把其添加到ListBox的SelectedItems集合,而点击一个选中的项会把其从集合里移除。

      Extended – 任何数量的项可以被同时选中,但这一行为是为单选所优化的。在这种模式选择多个连续的项需要按住Shift键,选择多个不连续的项应该按住Ctrl。

    • SelectedItem属性:用来设置或获取控件中被选择的项。虽然ListBox中主要使用ListBoxItem类型的对象,但也可以使用任意类型的对象,所以SelectedItem属性为object类型,我们在使用时需要先将这个值转换为适当的类型。

    ListBox中有一个ListBoxItem类,前文介绍的ComboBox继承自这个类并在此基础上添加了IsSelected属性及Selected属性 及Unselected事件。

    前文所述的TextSearch类在ListBox中也有很大作用,在ListBox拥有焦点的情况下,按下一个字母,就会自动转到Text值以此字母开头的第一项。

    让ListBox的项以水平方式排列的方法

    1. 定义新的控件模版

    2. 对于ItemControl所特有的方法,即使用ItemControl的ItemsPanel属性。ItemPanel可以在保持一切不变的情况下改变Items的排列。ListBox使用VirtualizingStackPanel来垂直排列它的项。

        知道了原理我们就可以使用以下XAML代码来将ListBox的项改为水平排列。

    1 <ListBox>
    2     <ListBox.ItemsPanel>
    3         <ItemsPanelTemplate>
    4             <VirtualizingStackPanel Orientation="Horizontal" />
    5         </ItemsPanelTemplate>
    6     </ListBox.ItemsPanel>
    7 </ListBox>

    参考:WPF中的内置面板

     

    小技巧:ListBox滚动的控制

    默认情况下,ListBox是一项项地滚动。当一项内容的高度比较大时,滚动显得不平稳。想要这个滚动变为基于像素的平稳的滚动的方法是将用于ListBox的附加属性ScrollViewer.CanScroll属性设置为false。(这样的缺点是失去ListBox的虚拟化,即不能实现当只有Item在可视状态时,才创建并呈现的特性,这个问题可能导致性能下降。)

    小技巧:ListBox(包括所有Item类的控件)中的项排序

    通过ItemsCollection对象(这就是ItemsControl的Item属性的类型)上提供的机制可以完成排序。ItemsCollection类型有一个名为SortDescriptions属性,其可以保存任意数量的System.ComponentModel.SortDescription实例。每个SortDescription实例描述一个元素被用来排序的属性,以及升序还是降序。

    示例:基于Content属性对一些ContentControl项进行排序

    1 //清除存在的排序
    2 myItemsControl.Items.SortDescriptions.Clear();
    3 //根据Content属性排序
    4 myItemsControl.Items.SortDescriptions.Add(new SortDescription("Content", ListSortDirection.Ascending));

    ListView (WPF)

    ListView从ListBox继承而来,其添加了一个名为View的属性,通过这个属性你可以将视图定义为一个更丰富的样子。View属性是ViewBase类型,这是个抽象类。GridView有一个名为Columns的内容属性,其中保存了一个GridViewColumn对象的集合。GridViewColumn的DisplayMemberBinding属性决定要在列中显示的数据。需要注意的是这个DisplayMemberBinding使用数据绑定技术,这点不同于DisplayMemberPath。

    另外ListView中的项是ListViewItem类型实例,ListViewItem派生自ListBoxItem。

    快速链接:数据绑定技术

     

    GridView的资源管理器样式的视图的特性:

    • 通过拖拉列对列重新排列。
    • 拖动列的分隔符(separator)改变列尺寸。
    • 通过双击列的分隔符,GridView根据当前内容调整列宽。

      另外,通过使用上文提到的SortDescription属性可以实现点击列头时按这列排序。

    使用ComboBox与ListBox等Items控件的最佳方法是:先将不具备呈现能力的数据(如自定义的业务对象)给控件,并定义数据模板(Tag)来决定每一个项的数据应该怎样被呈现。

    TabControl (WPF)

    使用TabControl控件可以实现在多个页面之间进行切换。

    TabControl的常见属性:

    TabStripPlacement:该属性为Dock类型,通过设置该属性为左,右,上或下,可以改变标签在控件上的位置。

    TabControl中使用TabItem类型包装每一项。这类似于ListBox中的ListBoxItem与ComboBox中的ComboBoxItem。

    不同于后两者的是TabItem需要显示声明,这样才能产生标签。类似于GroupBox或Expander,TabControl的头中也可包含任意元素。

    在TabControl中第一个项是默认选中的,可以通过编程将SelectedItem=null或SelectedIndex=-1的方式来取消选择所有标签。

  • 相关阅读:
    Intramart Service一览
    标签库列表
    CSS Expression用法总结
    URI,URL,URN的区别
    JSon数据查询Jlinq
    ie6,ie7兼容性总结
    实例说明扩展JQuery方式
    Android中的Parcel和Parcelable
    absolute绝对定位的非绝对定位用法
    [转载] 默认Web字体样式
  • 原文地址:https://www.cnblogs.com/lsxqw2004/p/4624043.html
Copyright © 2020-2023  润新知