多条目空见可以用来显示任意多项数据。所有的多条目恐惧都派生自虚类ItemsControl.
首先,该类定义了Items属性,任何派生自Object类型的实例都可添加到该属性中。Items是一个只读属性,该属性只支持通过添加、删除等操作控制器其包含的元素,而不能通过该属性进行设置。完成指定多条目控件所包含的所有元素这一功能的是ItemSource属性,而该属性的之一用途是对绑定进行支持。在设置了Items属性所包含的各个项目之后,WPF将不再允许后台代码对ItemSource属性进行设置;同样,在后台代码对ItemSource属性进行设置后,Items属性页不再允许被更改。
HasItems属性标识当前实例的Items属性是否包含任何元素。
ItemsControl对Items属性中包含的各个数据的显示是通过一个继承了ICollectionView接口的实例来实现的。通常情况下,开发人员可是有CollectionViewSource类的静态函数GetDefaultView来获得所带入的参数的默认显示类。
ICollectionView view=CollectionViewSource.getDefaultView(DataContext); object item=view.CurrentItem;
为完成各项显示效果,多条目空间还定义了ItemContainerStyle、ItemContainerStyleSelector、、ItemTemplate、ItemTemplateSelector属性。绘制过程如下:
- 首先,在WPF生成多条目控件的外观之前,系统向ItemContainerGenerator中记载的实例发出一个生成承载多条目控件所使用的容器的请求。
- 如果多条目控件在生成这一容器以前已经设置了ItemTemplate属性,则WPF将该属性记录的模板置入容器的ContentTemplate中;
- wPF根据控件的类型决定生成容器的类型,如TreeView控件生成的容器就是TreeViewItem。
- 由于各个容器都派生自ContentControl,因此WPF根据前述ContentControl类的外观生成步骤为容器生成最终外观。
对ItemControl的显示精细控制的还有DisplayMemberPath属性,该属性设置了ItemControl岁各个子项所显示的属性的名称。
<ListBox DisplayMemberPath="Name"> <Button Name="Button"/> <Label Name="Label"/> </ListBox> <!--等价于--> <Grid.Resources> <DataTemplate x:Key="itemTemplate"> <TextBlock Text="{Binding Path=Name}"/> </DataTemplate> </Grid.Resources> <ListBox ItemTemplate="{StaticResource itemTemplate}"> <Button Name="Button"/> <Label Name="Label"/> </ListBox>
==================================================================================
选项控件 Selector:
ComboBox从Selector派生后有添加了IsDropDownOpen属性,控制组合框的下拉列表的开闭。下拉列表的开闭触发事件DropDownOpened和DropDownClosed。MaxDropDownHeight设置下拉列表的高度;IsSelectionBoxHighlighted被选中选项高亮;IsEditable是否可编辑,true使显示的只能是字符串,复杂元素需要通过设置TextSearch.TextPath的复杂属性设定;isReadOnly false时接受更改,可编辑;StayOpenOnEdit true 下拉列表保持打开,并根据输入结果对选项进行匹配。
<Grid> <!--TextSearch.TextPath="Children[0].Name"表示选中某项时,显示其第一个子元素的Name属性--> <ComboBox Height="20" Width="100" IsEditable="True" TextSearch.TextPath="Children[0].Name" SelectedIndex="0"> <!--Item1--> <StackPanel Orientation="Horizontal" Margin="1"> <Image Width="16" Height="16" Source="Images/warning.bmp" Name="image1"/><!--选中后,编辑框显示image1--> <TextBlock Height="16" Text="This is item1"/> </StackPanel> <!--Item2--> <StackPanel Orientation="Horizontal" Margin="1"> <Image Width="16" Height="16" Source="Images/warning.bmp"/><!--选中后,显示为空--> <TextBlock Height="16" Text="This is item2"/> </StackPanel> <!--Item3--> <Image Width="16" Height="16" Source="Images/warning.bmp"/><!--选中后,显示为空--> <!--Item4--> <Image Width="16" Height="16" Source="Images/warning.bmp" TextSearch.Text="Image4"/><!--选中后,显示为Image4,因为TextSearch.Text设置了--> <!--Item5--> <StackPanel Orientation="Horizontal" Margin="1"> <Image Width="16" Height="16" Source="Images/warning.bmp" TextSearch.Text="Image5"/> <!--选中后,显示为空,因为TextSearch.Text的设置不在根节点--> <TextBlock Height="16" Text="This is item5"/> </StackPanel> </ComboBox> </Grid>
下拉列表中的选项也可由ComboBoxItem封装,一下声明等价
<StackPanel Orientation="Horizontal" Margin="1"> <Image Width="16" Height="16" Source="Images/warning.bmp" Name="image1"/><!--选中后,编辑框显示image1--> <TextBlock Height="16" Text="This is item1"/> </StackPanel> <ComboBoxItem> <StackPanel Orientation="Horizontal" Margin="1"> <Image Width="16" Height="16" Source="Images/warning.bmp" Name="image1"/> <!--选中后,编辑框显示image1--> <TextBlock Height="16" Text="This is item1"/> </StackPanel> </ComboBoxItem>
=======================================================================
ListBox对包含的项直接显示,选项组成与ComboBox相同。具有SelectedItems和SelectionMode属性:SelectedItems是一个集合,可包含多项内容。SelectionMode取值有三种:Single——单选;Multiple——多选,点击已选项取消选中,点击未选项则选中;Extended——(多选)按下Shift/Ctrl单击,将选项添加到选中项集合中。
=========================================================================
TabControl
TabScriptPlacement控制Tab标签所在方向,取值为Bottom、Left、Right、Top(默认);SelectedContent和SelectedItem更新不同步
==========================================================================
LIstView / Menu /ToolBar 略