WPF ItemsControl ListBox ListView比较

在进行列表信息展示时,WPF中提供多种列表可供选择。这篇博客将对WPF ItemsControl, ListBox, ListView进行比较。

相同点:

1. 这三个控件都是列表型控件,可以进行列表绑定(ItemsSource);

2. 这三个控件均使用ItemsPresenter来展示列表信息;

不同点:

控件层次关系:

ItemsControl:

System.Object 
  System.Windows.Threading.DispatcherObject
    System.Windows.DependencyObject
      System.Windows.Media.Visual
        System.Windows.UIElement
          System.Windows.FrameworkElement
            System.Windows.Controls.Control
              System.Windows.Controls.ItemsControl

ListBox:

System.Object 
  System.Windows.Threading.DispatcherObject
    System.Windows.DependencyObject
      System.Windows.Media.Visual
        System.Windows.UIElement
          System.Windows.FrameworkElement
            System.Windows.Controls.Control
              System.Windows.Controls.ItemsControl
                System.Windows.Controls.Primitives.Selector
                  System.Windows.Controls.ListBox

ListBox 继承于ItemsControl,增加了一个Selector对象,ItemsControl中的Item是不支持选择的。而ListBox中Item是支持选择,并且可以单选,多选。

ListView:

System.Object 
  System.Windows.Threading.DispatcherObject
    System.Windows.DependencyObject
      System.Windows.Media.Visual
        System.Windows.UIElement
          System.Windows.FrameworkElement
            System.Windows.Controls.Control
              System.Windows.Controls.ItemsControl
                System.Windows.Controls.Primitives.Selector
                  System.Windows.Controls.ListBox
                    System.Windows.Controls.ListView

ListView继承与ListBox,增加了一个View依赖属性。

ItemsControl是不包含水平和垂直方向的滚动条的。ListBox和ListView有水平和垂直方向滚动条。

ItemControl的样式:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="ItemsControlDefaultStyle" TargetType="{x:Type ItemsControl}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ItemsControl}">
                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" 

Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <!-- Resource dictionary entries should be defined here. -->
</ResourceDictionary>

ListBox和ListView的样式基本一样,除了TargetType外,

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <SolidColorBrush x:Key="ListBorder" Color="#828790"/>
    <Style x:Key="ListBoxDefaultStyle" TargetType="{x:Type ListBox}">
        <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
        <Setter Property="BorderBrush" Value="{StaticResource ListBorder}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
        <Setter Property="ScrollViewer.PanningMode" Value="Both"/>
        <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBox}">
                    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="1" 

SnapsToDevicePixels="true">
                        <ScrollViewer Focusable="false" Padding="{TemplateBinding Padding}">
                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </ScrollViewer>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                        </Trigger>
                        <Trigger Property="IsGrouping" Value="true">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <!-- Resource dictionary entries should be defined here. -->
</ResourceDictionary>

在项目中如何选择使用这三个控件;

1. 如果列表信息只做展示,但不提供选择功能,可以使用ItemsControl;

2. ListView比ListBox增加了一个View属性。

示例代码:

ItemsControl vs ListBox (Selector)

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <!--ItemsControl-->
        <StackPanel>
            <TextBlock Text="ItemsControl" FontSize="18"/>

            <ItemsControl ItemsSource="{Binding .}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Ellipse Width="110" Height="55" Fill="#ebebee"/>

                            <StackPanel>
                                <TextBlock Text="{Binding Priority}" FontSize="16" HorizontalAlignment="Center"/>
                                <TextBlock Text="{Binding Name}" FontSize="16" HorizontalAlignment="Center"/>
                            </StackPanel>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>

                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>

                <ItemsControl.ItemContainerStyle>
                    <Style>
                        <Setter Property="Control.Margin" Value="5"/>
                    </Style>
                </ItemsControl.ItemContainerStyle>
            </ItemsControl>
        </StackPanel>

        <!--ListBox-->
        <StackPanel Grid.Row="1">
            <TextBlock Text="ListBox" FontSize="18"/>
            <ListBox ItemsSource="{Binding .}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Ellipse Width="110" Height="55" Fill="#ebebee"/>

                            <StackPanel>
                                <TextBlock Text="{Binding Priority}" FontSize="16" HorizontalAlignment="Center"/>
                                <TextBlock Text="{Binding Name}" FontSize="16" HorizontalAlignment="Center"/>
                            </StackPanel>
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>

                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel/>
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>

                <ListBox.ItemContainerStyle>
                    <Style>
                        <Setter Property="Control.Width" Value="120"/>
                        <Setter Property="Control.Margin" Value="5"/>
                    </Style>
                </ListBox.ItemContainerStyle>

                <ListBox.Template>
                    <ControlTemplate>
                        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                            <ItemsPresenter/>
                        </ScrollViewer>
                    </ControlTemplate>
                </ListBox.Template>
            </ListBox>
        </StackPanel>
    </Grid>

C#

    public class Task
    {
        public string Name { get; set; }

        public int Priority { get; set; }
    }

    ObservableCollection<Task> _tasks = null;
    public MainWindow()
    {
        InitializeComponent();

        _tasks = new ObservableCollection<Task>()
        {
            new Task() { Name = "Shopping",Priority = 2 },
            new Task() { Name = "Laundry",Priority = 2 },
            new Task() { Name = "Email",Priority = 1 },
            new Task() { Name = "Writting",Priority = 2 },
            new Task() { Name = "Learning",Priority = 2 },
            new Task() { Name = "Working",Priority = 2 },
        };

        DataContext = _tasks;
    }

运行效果:

ListView View属性的使用

<ListView ItemsSource="{Binding .}">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="Task Name" DisplayMemberBinding="{Binding Name}" Width="100"/>
                <GridViewColumn Header="Task Priority" DisplayMemberBinding="{Binding Priority}" Width="100"/>
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

运行效果:

感谢您的阅读,代码点击这里下载。

时间: 2024-10-13 11:52:16

WPF ItemsControl ListBox ListView比较的相关文章

WPF中Listbox/ListView 横向展示/滑动内容的方法

<ListView Name="BoardListView" ScrollViewer.VerticalScrollBarVisibility="Hidden" Height="100" VerticalAlignment="Bottom"> <ListView.ItemsPanel> <ItemsPanelTemplate> <WrapPanel/> </ItemsPan

WPF中ListBox ListView数据翻页浏览笔记(强调:是数据翻页,非翻页动画)

ListBox和ListView在应用中,常常有需求关于每页显示固定数量的数据,然后通过Timer自动或者手动翻页操作,本文介绍到的就是该动作的实现. 一.重点 对于ListBox和ListView来讲,后台绑定的ItemSource绑定的一般都是List<T>格式,而List<T>有个方法是Take和Skip,分别意思是取List部分和跳过List部分. 取数据的格式是:List.take().Skip(); 二.话不多说,实例说话(后面会附有该例子链接,仅供参考) (1)Xam

利用Powershell快速对WPF的ListBox 数据源的绑定

有时候,我们在封闭的环境中做开发工作,并没有那么多便捷的开发工具,只能利用当前系统自带的基本工具做开发, 比如利用强大的framework,而powershell就是很好的开发工具,在不安装visual studio的情况下,就能实现大部分功能. 下面就用一个简单的例子来实现WPF中ListBox 数据源的绑定 1.关于dataset,我就不做多解释了,简单来说,就是一个或多个DataTable 对象的集合. 用powershell来实现的话,是简单不过的事情了. #Create Table o

C# WinForm开发系列 - ListBox/ListView/Panel

转自会飞的小猪文章 C# WinForm开发系列 - ListBox/ListView/Panel 在博客园看到了一篇博文,觉得很不错,就转载过来了. 包含自定义绘制的ListBox, 带拖动,图片显示, 内嵌其它控件, 打印等扩展功能的ListView(文章及相关代码搜集自网络,仅供学习参考,版权属于原作者! ). 1.ColorListBox   ColorListBox.zip 2.RadioListBox   RadioListBox.rar 3.扩展CheckedListBox控件  

WPF DataGrid、ListView 简单绑定

DataGrid运行效果: xaml 代码: DataGridName= dtgData ItemsSource= {Binding} AutoGenerateColumns= False DataGrid.Columns DataGridTextColumnBinding= {BindingPath=id} Header= ID HeaderStringFormat= id / DataGridTextColumnBinding= {BindingPath=name} Header= 名称 H

WPF中ListBox滚动时的缓动效果

原文:WPF中ListBox滚动时的缓动效果 上周工作中遇到的问题: 常规的ListBox在滚动时总是一格格的移动,感觉上很生硬. 所以想要实现类似Flash中的那种缓动的效果,使ListBox滚动时可以很流畅. 修改模板里的动画效果是一种方法,不过这里有更简单的,WPF为我们提供了行为代码,可以编辑在ListBox的ItemsPanelTemplate模板中,实现方法如下: 右键ListBox选择"编辑其它模板"->"辑项的布局"->"编辑副

用WPF实现在ListView中的鼠标悬停Tooltip显示

原文:用WPF实现在ListView中的鼠标悬停Tooltip显示 一.具体需求描述 在WPF下实现,当鼠标悬停在ListView中的某一元素的时候能弹出一个ToolTip以显示需要的信息. 二.代码实现 在.XMAL文件中 Code<Window.Resources> <DataTemplate x:Key="dataTemplateCheckBox"> <StackPanel Orientation="Horizontal">

WPF 实现 DataGrid/ListView 分页控件

在WPF中,通常会选用DataGrid/ListView进行数据展示,如果数据量不多,可以直接一个页面显示出来.如果数据量很大,2000条数据,一次性显示在一个页面中,不仅消耗资源,而且用户体验也很糟糕.这篇博客将介绍如何创建一个分页控件. 为了简单起见,这个分页控件目前只有 首页/上一页/下一页/末页/总页数/第几页 等功能.实现思路,首页/上一页/下一页/末页 这四个通过路由事件来实现,在使用时可以使用命令进行绑定,或者直接使用均可.总页数和第几页通过依赖属性来实现,使用时将页数进行绑定显示

WPF Tips: Listbox SelectionChanged触发前的选项

想在Listbox的SelectionChanged事件触发时对之前的选项进行处理.但是listbox没有previewSelectionChanged事件. 解决办法: 1. Validation 因为要处理的项在TextBox中,所以可以给TextBox添加一个Validation.但是由于TextBox是与Property Binding,而Validation是在binding赋值之前进行操作(调试过程中是这样的流程),所以无法获取textbox中的值.如果没有binding应该是可以.