WPF学习总结和记录(三)Items控件上

来源:互联网 发布:乐乎 蜘蛛侠abo 编辑:程序博客网 时间:2024/05/16 16:07

Items 控件包含了一个拥有许多Item 的集合而不是只是一条内容。所有的Items 控件都是继承自ItemsControl抽象类的,它们是Control类的直系子类。

 

    <ListBox xmlns:sys="clr-namespace:System;assembly=mscorlib" >
        <Expander Header="Expander" />
        <sys:DateTime>1/1/2013</sys:DateTime>
        <sys:DateTime>2/2/2013</sys:DateTime>
        <sys:DateTime>3/3/2013</sys:DateTime>
    </ListBox>

    <ListBox xmlns:sys="clr-namespace:System;assembly=mscorlib" DisplayMemberPath="DayOfWeek">
        <Expander Header="Expander" />
        <sys:DateTime>1/1/2013</sys:DateTime>
        <sys:DateTime>2/2/2013</sys:DateTime>
        <sys:DateTime>3/3/2013</sys:DateTime>
    </ListBox>

 

把DisplayMemberPath 设置为DayOfWeek 后,WPF 会渲染每一个项的DayOfWeek 属性值,而不是每个Item 本身。这就是图 中3 个DateTime 对象被渲染为星期的原因。(这
是基于ToString 的渲染,每一个由DayOfWeek 属性返回的DayOfWeek 枚举值将被ToString 转换为字符串。)由于Button 和Expander 没有DayOfWeek 属性,它们会被作为空TextBlock 渲染。

·SelectedIndex——非负的整型数,它表示哪个Item 被选择了,如果没有东西被选择,则用-1 表示。Item是根据被添加到集合中的顺序来计数的。
·SelectedItem——当前被选中的Item 的实例。
·SelectedValue——当前被选中的Item 的值。默认情况下这个值是Item 本身,这时Selec- tedValue 与SelectedItem 是一样的。通过设置SelectedValuePath 去选择任意的属性或者表达式,用来表示每个Item 的值
(SelectedValuePath 与DisplayMemberPath 工作原理一样)。
所有3 个属性都是可读写的,所以可以用它们去改变当前的选择,也可以用它们得到当前的选择。
Selector 也支持两个附加属性,可以把它们应用到单独的Item 上去:
·IsSelected——可以用来判断选择或者未被选择的Boolean 变量 (也可以用来获得当前选择的状态)。
·IsSelectionActive—— 说明选择的Item 是否拥有焦点的Boolean 变量。
Selector 同样定义了SelectionChanced 事件,它会监听当前选择内容是否被改变。之前的章节在用ListBox演示附加事件的时候用到了这个属性。

 

1. ComboBox

ComboBox 允许用户在选择框里输入任何文字。如果文字和现存的Item 一样,那个Item 就会自动被选中。否则,没有Item 会被选中,但是自定义文字会被存储在ComboBox 的Text 属性中

ComboBox 的IsEditable 和IsReadOnly 属性的差别在哪里?
把IsEditable 设置为true 就等于把ComboBox 的选择框变为一个文本框。IsReadOnly 属性决定文本框是否可以被编辑,就像TextBox 的IsReadOnly 属性一样。也就是说,除非IsEditable 为true,否则IsReadOnly就毫无作用,同时IsEditable 被设为true 并不意味着选择的文字可以被编辑.

一个拥有复杂Item 的ComboBox,类似Microsoft Office 风格的“画廊”

 

    <StackPanel>
        <ComboBox>
                <StackPanel  Orientation="Horizontal" Margin="5">
                    <Image Source="2.jpg" />
                    <StackPanel Width="200">
                        <TextBlock Margin="5,0" FontSize="14" FontWeight="Bold" VerticalAlignment="Center">Curtain call</TextBlock>
                        <TextBlock Margin="5" VerticalAlignment="Center" TextWrapping="Wrap">Whimsical, with a red curtain.</TextBlock>
                    </StackPanel>
                </StackPanel>
                <StackPanel Orientation="Horizontal" Margin="5">
                    <Image Source="1.jpg" />
                    <StackPanel Width="200">
                        <TextBlock Margin="5,0" FontSize="14" FontWeight="Bold" VerticalAlignment="Center">Fireworks</TextBlock>
                        <TextBlock Margin="5" VerticalAlignment="Center" TextWrapping="Wrap">Sleek, with a black  curtain.</TextBlock>
                    </StackPanel>
                </StackPanel>
        </ComboBox>
    </StackPanel>

 

ComboBox 隐式地把它每个项包装在一个ComboBoxItem 对象内。(如果根据任何Item 详细研究可视化树,就能从代码里看到这点。)但是你能显式地在一个ComboBoxItem 中包装任何一个Item,而ComboBoxItem 是一个内容控件。

 

2.ListBox

大家熟悉的ListBox 控件和ComboBox 类似,但ListBox 所有的项都直接在控件的边界以内显示(如果它们没有都被显示的话,也可以用滚动条去查看没有显示出来的项)

通过SelectionMode 属性可以控制这个特性,这个属性接受3 个值(来自于SelectionMode 枚举):
·Single(默认)——一次只能选择一项,就像ComboBox 一样。
·Mulle——可以同时选择任何数目的项,点击一个未选中的项将把它添加到ListBox 的Sel- ectedItems集合,而点击一个选中的项会把它从集合里移除。
·Extended——任何数量的项可以被同时选中,但是这一行为是为单选情况所优化的。如果在这种模式下选择多个项,点击的时候必须按住Shift (连续的项)或者Ctrl(不连续的项)。该行为和Win32 ListBox控件一样。

设置方向为水平的方向

            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>

把ListBox 上的ScrollViewer.CanContentScroll 附加属性设为false。可以使ListBox 平稳地滚动。

ScrollViewer.CanContentScroll="False"

原创粉丝点击