• 【WPF应用30】WPF中的ListBox控件详解


    WPF(Windows Presentation Foundation)是.NET框架的一个组成部分,用于构建桌面应用程序的用户界面。ListBox是WPF中一个非常常用的控件,用于显示一系列的项,用户可以选择单个或多个项。

    1.ListBox的基本概念

    ListBox控件允许用户从一系列的项目中选择一个或多个项目。它继承自Selector控件,主要用于显示数据绑定的列表。ListBox可以用来展示枚举类型、自定义对象或者任何满足数据绑定要求的对象集合。

    2.ListBox的属性

    ListBox拥有许多属性,这些属性可以用来定制其外观和行为。以下是一些常用的属性:

    • ItemsSource:指定ListBox的数据源,通常是一个集合。
    • DisplayMemberPath:指定绑定到ListBox的显示属性。
    • SelectedValuePath:指定绑定到ListBox的选择值属性。
    • SelectionMode:定义选择模式,如单选、多选等。
    • IsSynchronizedWithCurrentItem:确定ListBox是否与当前项同步滚动。
    • ItemsPanel:定义ListBox中项的布局。
    • ItemContainerStyle:指定ListBox中每个项的样式。

    3.ListBox的事件

    ListBox也定义了一系列的事件,允许开发者对用户的操作做出响应,如:

    • SelectionChanged:当选择的项目发生变化时触发。
    • MouseDoubleClick:当用户双击鼠标时触发。
    • MouseLeftButtonDown:当用户按下鼠标左键时触发。

    4. ListBox的示例

    以下是一个简单的ListBox示例,展示如何在WPF应用程序中创建和使用ListBox控件:

    <Window x:Class="WpfApp.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="ListBox示例" Height="200" Width="300">
        <StackPanel>
            <ListBox x:Name="MyListBox"
                     Width="200"
                     Height="150">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Name}" />
                    DataTemplate>
                ListBox.ItemTemplate>
                <ListBox.ItemsSource>
                    <Binding Source="{StaticResource Countries}" Path="CountriesList" />
                ListBox.ItemsSource>
            ListBox>
            <Button Content="选择项"
                    Width="75"
                    Height="25"
                    Click="SelectItemButton_Click" />
        StackPanel>
    Window>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这个示例中,我们创建了一个名为MyListBox的ListBox控件,并为其定义了ItemTemplate和ItemsSource。同时,我们添加了一个按钮,当点击按钮时,会触发SelectItemButton_Click事件处理函数,用于获取选中的ListBox项。

    C#代码后端可能如下所示:

    using System.Collections.ObjectModel;
    using System.Windows;
    
    namespace WpfApp
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                Countries = new ObservableCollection<Country>();
                // 添加一些国家数据到Countries集合
            }
    
            private void SelectItemButton_Click(object sender, RoutedEventArgs e)
            {
                if (MyListBox.SelectedItem != null)
                {
                    MessageBox.Show("选中的项是:" + ((Country)MyListBox.SelectedItem).Name);
                }
            }
    
            public ObservableCollection<Country> Countries { get; set; }
        }
    
        public class Country
        {
            public string Name { get; set; }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这个示例中,我们创建了一个名为Country的类,用于表示国家数据。我们还将这些数据添加到了Countries观察集合中,并将其绑定到了MyListBox的ItemsSource属性。

    5. ListBox控件的一些基本用法和高级技巧

    数据绑定

    ListBox最常见的用途就是显示和选择数据。你可以使用ItemsSource绑定到数据源,比如一个List,ObservableCollection或其他可枚举对象。DisplayMemberPath属性用于指定列表中每个项目的显示属性,SelectedValuePath用于指定选中项的值所对应的属性。

    <ListBox x:Name="MyListBox"
             ItemsSource="{Binding Countries}"
             DisplayMemberPath="CountryName"
             SelectedValuePath="CountryID"/>
    
    • 1
    • 2
    • 3
    • 4

    在这个例子中,Countries是一个集合,CountryName是集合中每个国家对象的显示属性,CountryID是选中项的值。

    选择模式

    ListBox的选择模式决定了用户可以选择一个还是多个项目。SelectionMode属性可以设置为Single、Multiple或Extended。

    <ListBox x:Name="MyListBox"
             SelectionMode="Multiple"/>
    
    • 1
    • 2

    项样式

    ListBox允许你为每个项自定义样式。可以使用ItemContainerStyle属性来指定通用的样式,或者为特定状态(如正常、鼠标悬停、选中)使用ItemContainerStyleSelector。

    <ListBox x:Name="MyListBox"
             ItemContainerStyle="{StaticResource MyListBoxItemStyle}">
    ListBox>
    
    • 1
    • 2
    • 3

    在样式资源中定义样式:

    <Style x:Key="MyListBoxItemStyle" TargetType="ListBoxItem">
        "Background" Value="LightGray"/>
        "Foreground" Value="Black"/>
        
    Style>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    事件处理

    ListBox定义了几个事件,如SelectionChanged,你可以在这个事件中处理选中项的变化。

    private void MyListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (MyListBox.SelectedItem != null)
        {
            // 处理选中项
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    虚拟化

    对于大型数据集,ListBox支持虚拟化,这意味着它只加载和渲染可见的项,从而提高性能。要启用虚拟化,需要设置VirtualizingStackPanel或VirtualizingPanel作为ItemsPanel。

    <ListBox x:Name="MyListBox"
             ItemsPanel="{StaticResource VirtualizingStackPanel}">
    ListBox>
    
    • 1
    • 2
    • 3

    在资源字典中定义VirtualizingStackPanel:

    <VirtualizingStackPanel x:Key="VirtualizingStackPanel"/>
    
    • 1

    分组和筛选

    ListBox允许对项目进行分组,并且可以通过GroupStyle来定义分组的样式。此外,可以通过Filter方法来筛选项目。

    private void MyListBox_Filter(object sender, FilterEventArgs e)
    {
        // 应用筛选条件
        e.Accepted = /* 条件判断 */;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    以上是ListBox控件的一些基本用法和高级技巧。在实际的WPF应用程序开发中,根据不同的需求,你可以灵活运用这些知识和技巧来创建功能丰富、用户友好的界面。

    6. ListBox的扩展和自定义

    除了基本的用法,ListBox还可以通过扩展方法和自定义控件来提供更多的功能。例如,你可以创建一个自定义的ListBox,它在内部处理虚拟化,提供更好的性能,或者增加额外的功能,如排序、过滤等。

    此外,可以通过创建ListBox.ItemTemplate来定义项的显示方式,可以使用数据绑定的DataTemplate来创建复杂的布局,包括文本、图像、复选框等。

    7.ListBox与其他控件结合使用

    在WPF(Windows Presentation Foundation)中,ListBox 控件同样可以与其他控件结合使用以实现丰富的用户界面功能。以下是一些示例,展示了如何将 ListBox 与不同的WPF控件结合使用:

    与Button结合使用 - 添加项到ListBox

    在这个例子中,当用户点击按钮时,会向ListBox中添加一个新的项。

    <Button Content="添加项" Click="AddItemButton_Click"/>
    <ListBox x:Name="myListBox"/>
    
    • 1
    • 2
    private void AddItemButton_Click(object sender, RoutedEventArgs e)
    {
        myListBox.Items.Add("新项");
    }
    
    • 1
    • 2
    • 3
    • 4

    与ComboBox结合使用 - 动态更新下拉列表

    这个示例中,ComboBox的值会动态地更新到ListBox中。

    <ComboBox x:Name="myComboBox"/>
    <ListBox x:Name="myListBox"/>
    
    • 1
    • 2
    private void MyComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        myListBox.Items.Add(myComboBox.SelectedItem);
    }
    
    • 1
    • 2
    • 3
    • 4

    与DataGridView结合使用 - 数据绑定

    在WPF中,通常使用DataGrid控件而不是DataGridView,DataGrid可以与ListBox控件进行数据绑定。

    <DataGrid x:Name="myDataGrid"/>
    <ListBox x:Name="myListBox"/>
    
    • 1
    • 2
    private void MyDataGrid_Loaded(object sender, RoutedEventArgs e)
    {
        myListBox.ItemsSource = myDataGrid.Items;
    }
    
    • 1
    • 2
    • 3
    • 4

    与CheckBox结合使用 - 实现多选功能

    通过将CheckBox与ListBox结合使用,可以实现多选功能。

    <CheckBox Content="多选" Click="MultiSelectCheckBox_Click"/>
    <ListBox x:Name="myListBox"/>
    
    • 1
    • 2
    private void MultiSelectCheckBox_Click(object sender, RoutedEventArgs e)
    {
        if (myListBox.SelectionMode == ListBoxSelectionMode.Single)
        {
            myListBox.SelectionMode = ListBoxSelectionMode.Multiple;
        }
        else
        {
            myListBox.SelectionMode = ListBoxSelectionMode.Single;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    与TextBox结合使用 - 过滤和搜索功能

    TextBox可以用来实时过滤ListBox中的项,以便用户只看到匹配特定模式的项。

    <TextBox x:Name="myTextBox" LostFocus="FilterTextBox_LostFocus"/>
    <ListBox x:Name="myListBox"/>
    
    • 1
    • 2
    private void FilterTextBox_LostFocus(object sender, RoutedEventArgs e)
    {
        string filter = myTextBox.Text.ToUpper();
        myListBox.Items.Filter = item => !string.IsNullOrEmpty(filter) ? item.ToString().ToUpper().Contains(filter) : true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    请注意,这些示例假设你的WPF应用程序已经正确地初始化了这些控件,并且你已经为相应的事件处理方法绑定了事件。在实际开发中,你可能需要根据应用程序的具体需求调整这些示例代码。

    总结

    WPF的ListBox控件是一个非常强大和灵活的工具,它可以满足多种显示和选择需求。通过数据绑定、样式、事件处理和自定义,开发者可以创建出功能丰富且具有良好用户体验的列表控件。

    在实际开发中,ListBox通常用于显示具有层次结构的列表数据,如文件系统、联系人列表或任何需要选择和操作的项目集合。通过结合其他WPF控件和数据绑定的能力,ListBox成为构建复杂用户界面的一个核心组件。

    希望这篇博客能够帮助你更好地理解和使用WPF中的ListBox控件。在实际应用中,你可以根据项目的具体需求,灵活运用ListBox控件的各种属性和功能,以创建出既美观又实用的用户界面。

  • 相关阅读:
    Unity-镜头移动的相关逻辑
    HC32L110 在 Ubuntu 下使用 J-Link 烧录
    英语小作文写作模板及步骤(1)
    05-prometheus的联邦模式-分布式监控
    Linux入门与进阶(二)
    【小白专用 已验证24.5.30】ThinkPHP6 视图
    阿里开源玄铁RISC-V系列处理器,推动RISC-V架构走向成熟
    DSPE-PEG-Biotin,CAS:385437-57-0,磷脂-聚乙二醇-生物素可延长循环半衰期
    ES6中的Promise对象
    2022上半年信息系统项目管理师综合知识真题(21-40)
  • 原文地址:https://blog.csdn.net/qq_35320456/article/details/137355906