WPF基础五:UI④ 条目控件ListView

ListView

表示用于显示数据项列表的控件。

ListView 为 ItemsControl ,这意味着它可以包含任何类型的对象的集合 (例如字符串、图像或面板) 。 有关更多信息,请参见 ItemsControl 类。

 ListView中数据项的表示方式由其查看模式定义,该模式由View属性指定。Windows Presentation Foundation(WPF)提供了GridView视图模式,该模式将ListView数据项内容划分为多个列。GridView及其相关类的属性和方法将样式化并指定列的内容。

下图显示了带有GridView视图的ListView。。

具有 GridView 输出的 ListView

您还可以通过创建派生自ViewBase的类来定义自定义视图。有关更多信息,请参见如何:为ListView创建自定义视图模式

如果您为ListView控件定义了自定义ItemContainerStyle,并且还定义了ItemTemplate,则必须在ItemContainerStyle中包括ContentPresenter。必须使用ContentPresenter才能使ItemTemplate正常工作。

为了避免GridView视图模式下的对齐问题,请不要在ListViewItemContainerStyle中添加影响项目宽度的内容或设置属性。为防止对齐问题,请使用为GridView视图模式定义的属性和模板。这包括为在GridView视图模式下使用的类定义的属性和模板,例如GridViewColumnGridViewColumnHeader

两个ListView控件不能共享同一视图。若要指定可以多次使用的视图,请使用模板或样式。有关定义为可重用资源的GridView和其他自定义视图的示例,请参见具有多个视图示例的ListView

不要对使用GridView显示的ListView内容使用Horizo​​ntalContentAlignmentVerticalContentAlignment属性。要在GridView的列中指定内容的对齐方式,请定义一个CellTemplate

显示大量项目可能会导致性能问题。有关更多信息,请参见优化性能:控件

自定义ListView控件

要将相同的属性设置应用于多个ListView控件,请使用Style属性。您可以修改默认的ControlTemplate以使控件具有唯一的外观。有关创建ControlTemplate的更多信息,请参见通过创建ControlTemplate自定义现有控件的外观。若要查看特定于ListView的零件和状态,请参见ListView样式和模板

此控件的依赖项属性可以由控件的默认样式设置。如果使用默认样式设置属性,则当控件出现在应用程序中时,该属性可能会从其默认值更改。默认样式由运行应用程序时使用的桌面主题确定。有关更多信息,请参见默认WPF主题

Note

设置视觉属性仅在该属性同时存在于控件的默认模板中并且通过使用TemplateBinding进行设置时才有效。您可以在通过创建ControlTemplate定制现有控件的外观的更改控件的视觉结构”部分中找到视觉属性列表。


名称备注权限

ViewProperty

标识 View 依赖项属性。public static readonly
名称备注权限

View

获取或设置一个对象,用于定义如何在 ListView 控件中设置数据样式和组织数据。get; set;
名称备注权限

ClearContainerForItemOverride

移除显示为 ListViewItem 的对象的所有模板、样式和绑定。protected

GetContainerForItemOverride

创建并返回一个新的 ListViewItem 容器。protected

IsItemItsOwnContainerOverride

确定对象是否为 ListViewItemprotected

OnCreateAutomationPeer

定义 AutomationPeer 控件的 ListViewprotected

OnItemsChanged

响应 OnItemsChanged(NotifyCollectionChangedEventArgs)protected

PrepareContainerForItemOverride

为 ListViewItem 设置样式、模板和绑定。protected

ListViewItem 

表示 ListView 控件中的一个项。

ListViewItem是 ContentControl ,这意味着它可以包含任何类型的单个对象 (例如字符串、图像或面板) 。 有关更多信息,请参见 ContentControl 类。

ListView通常通过ListViewItem 设置 ItemsSource 属性或 Items 属性来指定其控件的内容。

为 ListViewItem 类型定义的模板和样式,用于指定在 ListView 中显示内容。

自定义 ListViewItem 控件

若要对多个 ListViewItem 控件应用相同的属性设置,请使用 Style 属性。 您可以修改 ControlTemplate 默认值,为控件指定独特的外观。 有关创建 ControlTemplate 的详细信息,请参阅 通过创建 System.windows.controls.controltemplate> 自定义现有控件的外观。 若要查看特定于 ListViewItem 的部分和状态,请参阅 ListView 样式和模板

此控件的依赖属性可能由控件的默认样式设置。 如果按默认样式设置属性,则当控件出现在应用程序中时,属性可能会更改为默认值。 默认样式取决于应用程序运行时使用的桌面主题。 有关详细信息,请参阅 默认的 WPF 主题

Note

只有视觉对象属性已存在于TemplateBinding 控件的默认模板中并且已使用 设置时,设置该属性才有效。 在通过创建 ControlTemplate 自定义现有控件的外观一文的更改控件的视觉结构部分可以找到视觉属性列表。


基本功能和ListBox相似,多了一个View属性,如上图。


XAML范例

<Window x:Class="ListViewDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ListViewDemo"
        mc:Ignorable="d"
        Title="MainWindow" Height="500" Width="600">
    <StackPanel x:Name="myStackPanel">
        <ListView SelectionMode="Extended" Height="200" SelectionChanged="OnSelectionChanged" >
            <ListView.View>
                <GridView AllowsColumnReorder="true" ColumnHeaderToolTip="Employee Information">
                    <GridViewColumn  Header="First Name" Width="100"/>
                    <GridViewColumn  Width="100">
                        <GridViewColumnHeader>Last Name
                        </GridViewColumnHeader>
                    </GridViewColumn>
                    <GridViewColumn Header="Employee No." Width="100"/>
                </GridView>
            </ListView.View>            
            <ListViewItem  Content="ListViewItem0" />
            <ListViewItem  Content="ListViewItem1" IsSelected="True"/>
            <ListViewItem  Content="ListViewItem2"/>
            <ListViewItem  Content="ListViewItem3" IsSelected="True"/>
            <ListViewItem  Content="ListViewItem4"/>
            <ListViewItem  Content="ListViewItem5"/>         
        </ListView>
        <TextBlock Height="200">
        </TextBlock>
        <Button Content="全选" Click="OnListViewSelectAll"/>
        <Button Content="取消全选" Click="OnListViewUnselectAll"/>
    </StackPanel>
</Window>
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace ListViewDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void OnListViewSelectAll(object sender, RoutedEventArgs e)
        {
            foreach (var item in ((sender as Button).Parent as StackPanel).Children)
            {
                if (item is ListBox) (item as ListBox).SelectAll();
            }
        }

        private void OnListViewUnselectAll(object sender, RoutedEventArgs e)
        {
            foreach (var item in ((sender as Button).Parent as StackPanel).Children)
            {
                if (item is ListBox) (item as ListBox).UnselectAll();
            }
        }

        private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string s = String.Empty;
            foreach (var item0 in (sender as ListBox).SelectedItems)
            {
                s += (item0 as ListBoxItem).Content + "\n";
            }

            foreach (var item in ((sender as ListBox).Parent as StackPanel).Children)
            {
                if (item is TextBlock) (item as TextBlock).Text = s;
            }
        }
    }

}

C#范例

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace ListViewDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            GridView myGridView = new GridView();
            myGridView.AllowsColumnReorder = true;
            myGridView.ColumnHeaderToolTip = "Employee Information";

            GridViewColumn gvc1 = new GridViewColumn();
            gvc1.Header = "FirstName";
            gvc1.Width = 100;
            myGridView.Columns.Add(gvc1);
            GridViewColumn gvc2 = new GridViewColumn();
            gvc2.Header = "Last Name";
            gvc2.Width = 100;
            myGridView.Columns.Add(gvc2);
            GridViewColumn gvc3 = new GridViewColumn();
            gvc3.Header = "Employee No.";
            gvc3.Width = 100;
            myGridView.Columns.Add(gvc3);

   

            ListView listview = new ListView();
            listview.SelectionMode = System.Windows.Controls.SelectionMode.Extended;
            listview.Height = 200;
            listview.SelectionChanged += OnSelectionChanged;
            for (int i = 0; i < 8; i++)
            {
                listview.Items.Add(new ListViewItem { Content = "ListViewItem" + i });
            }
             (listview.Items[1] as ListViewItem).IsSelected = true;
            (listview.Items[3] as ListViewItem).IsSelected = true;
            (listview.Items[6] as ListViewItem).IsSelected = true;

            TextBlock textBlock = new TextBlock { Height = 200 };
            Button button1 = new Button { Content = "全选" };
            button1.Click += OnListViewSelectAll;
            Button button2 = new Button { Content = "取消全选" };
            button2.Click += OnListViewUnselectAll;

            StackPanel mystackPanel = new StackPanel();
            mystackPanel.Children.Add(listview);
            mystackPanel.Children.Add(textBlock);
            mystackPanel.Children.Add(button1);
            mystackPanel.Children.Add(button2);


            this.Content=mystackPanel;
            foreach (var item in (this.Content as StackPanel).Children)
            {
                if (item is ListView) (item as ListView).View = myGridView;
            }
        }
        private void OnListViewSelectAll(object sender, RoutedEventArgs e)
        {
            foreach (var item in ((sender as Button).Parent as StackPanel).Children)
            {
                if (item is ListBox) (item as ListBox).SelectAll();
            }
        }

        private void OnListViewUnselectAll(object sender, RoutedEventArgs e)
        {
            foreach (var item in ((sender as Button).Parent as StackPanel).Children)
            {
                if (item is ListBox) (item as ListBox).UnselectAll();
            }
        }

        private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string s = String.Empty;
            foreach (var item0 in (sender as ListBox).SelectedItems)
            {
                s += (item0 as ListBoxItem).Content + "\n";
            }
            if((sender as ListBox).Parent !=null)
            {
                foreach (var item in ((sender as ListBox).Parent as StackPanel).Children)
                {
                    if (item is TextBlock) (item as TextBlock).Text = s;
                }
            }
           
        }
    }

}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以通过修改WPF ListView中每个Item的样式来实现自定义每一行的颜色。具体步骤如下: 1. 在XAML中定义ListView的ItemContainerStyle,指定ItemContainerStyle为ListView.ItemContainerStyle属性的值。例如: ``` <ListView x:Name="myListView"> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <!--在这里定义Item的样式--> </Style> </ListView.ItemContainerStyle> </ListView> ``` 2. 在Style中添加一个Trigger,根据Item的数据内容来设置颜色。例如: ``` <Style TargetType="ListViewItem"> <Style.Triggers> <DataTrigger Binding="{Binding Status}" Value="New"> <Setter Property="Background" Value="Green"/> </DataTrigger> <DataTrigger Binding="{Binding Status}" Value="Completed"> <Setter Property="Background" Value="LightGray"/> </DataTrigger> </Style.Triggers> </Style> ``` 在这个例子中,根据绑定到ListViewItem的数据对象的Status属性的值来设置Item的背景颜色。 希望这个回答对你有帮助! ### 回答2: 要自定义WPF ListView每一行的颜色,可以使用ListView的ItemContainerStyle属性来实现。 首先,在XAML代码中,创建一个样式资源并应用于ListView的ItemContainerStyle属性,代码如下: ```xml <ListView> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <Setter Property="Background" Value="LightGray"/> <Style.Triggers> <Trigger Property="ItemsControl.AlternationIndex" Value="1"> <Setter Property="Background" Value="White"/> </Trigger> </Style.Triggers> </Style> </ListView.ItemContainerStyle> </ListView> ``` 上述代码中,我们定义了一个样式资源,并将它应用到ListView的ItemContainerStyle属性上。在样式中,我们设置了默认的背景颜色为LightGray,然后使用Trigger来切换偶数行和奇数行的背景颜色。当ItemsControl.AlternationIndex属性的值为1时,表示奇数行,我们设置背景颜色为White。 如果想要进一步自定义每行的颜色,可以修改Style中的Setter对象的Value属性值。 需要注意的是,为了使触发器生效,ListView的ItemsPanel需要设置为一个ItemsControl,例如Grid,如下所示: ```xml <ListView> <ListView.ItemsPanel> <ItemsPanelTemplate> <Grid/> </ItemsPanelTemplate> </ListView.ItemsPanel> <!-- 此处省略数据绑定部分 --> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <!-- 此处省略样式设置部分 --> </Style> </ListView.ItemContainerStyle> </ListView> ``` 以上就是通过ItemContainerStyle属性自定义WPF ListView每一行颜色的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值