Wpf – Alternate background color of ListView.
Topic: Wpf – Alternate background color of ListView.
标题: wpf – ListView交替背景色
总的来说有三种变换背景色的方法,他们是
· 定义一个IValueConverter的Style
· 扩展ListView ,重载PrepareContainerOverride方法
· 使用 StyleSelector
In general there are three ways to alternate the background color of a ListView.
They are
· Define a style that uses an IValueConverter to Alternate Background color
· Derive a New class from ListView to Alternate Background color
· Use a StyleSelector to Alternate Background color
首先看一看ValueConverter,代码如下:
First we need to introduce the ValueConverter, the code as below.
public sealed class BackgroundConverter : IValueConverter { #region IValueConverter public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { ListViewItem item = (ListViewItem) value; ListView listView = ItemsControl.ItemsControlFromItemContainer(item) as ListView; // Use the ItemsControl.ItemsContainerFromItemContainer(item) to get the ItemsControl.. and cast // Get the index of a ListViewItem int index = listView.ItemContainerGenerator.IndexFromContainer(item); // this is a state-of-art way to get the index of an Item from a ItemsControl if (index % 2 == 0) return Brushes.LightBlue; else { return Brushes.Beige; } } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } #endregion IValueConverter }
它使用了ListView.ItemsControlFromItemContainer(item)拿到Item 的Container,然后, 调用ListView.ItemContainerGenerator.IndexFromContainer(item);得到Container的index;
这样使用该Style.
Basically, it uses the ListView.ItemsControlFromItemContainer(item) to get the container for an single Item, and then with the Container that it returns, it can get an index from the ListView – the method to call is ListView.ItemContainerGenerator.IndexFromContainer(item);
You will need to apply the Style somewhere.
<namespc:BackgroundConverter xmlns:namespc="clr-namespace:AlternativeBackgroundListView.Converters" x:Key="myConverter" /> <Style x:Key="myItemStyle" TargetType="{x:Type ListViewItem}"> <Setter Property="Background"> <Setter.Value> <Binding RelativeSource="{RelativeSource Self}" Converter="{StaticResource myConverter}" /> </Setter.Value> </Setter> </Style>
在ListView上使用该style
And you will need to apply that style on the ListView.
<!-- Set Style on the IemContainer style The key is the "ItemContainerStyle --> <ListView x:Name="ListView" ItemsSource="{Binding Customers}" ItemContainerStyle="{StaticResource myItemStyle}" Grid.Row="0" > <ListView.Resources> </ListView.Resources> <ListView.View> <GridView AllowsColumnReorder="True" ColumnHeaderToolTip="Some Tooltip" > <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="Auto" ></GridViewColumn> <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" Width="Auto" ></GridViewColumn> <GridViewColumn Header="Address" DisplayMemberBinding="{Binding Address}" Width="Auto" > </GridViewColumn> </GridView> </ListView.View> </ListView>
扩展一个ListView
Derive a new class from ListView to alternate the background of a color.
首先看以下SubListView 类
We first introduce the sub listview that we wrote.
public sealed class SubListView : ListView { protected override void PrepareContainerForItemOverride(System.Windows.DependencyObject element, object item) { base.PrepareContainerForItemOverride(element, item); if (View is GridView) { int index = ItemContainerGenerator.IndexFromContainer(element); // The ItemContainerGenerator has method to get index for a given Item ListViewItem lvi = element as ListViewItem; if (index%2 == 0) lvi.Background = Brushes.LightBlue; else { lvi.Background = Brushes.Beige; } } } }
关键在于ItemContainerGenerator.IndexFromContainer(哪里见过呢),要重载的方法是PreareContianerOverride().
The key here is the ItemContainerGenerator.IndexFromContainer (sounds familiar)?? And the method that we override is PreareContianerOverride()
使用SubListView, xaml如下
To use the SubListview, you can use this in the xaml file.
<!-- the PrepareContainerForItemOverride is the key to the SubListView --> <namespc:SubListView xmlns:namespc="clr-namespace:AlternativeBackgroundListView.Controls" x:Name="SubListView" ItemsSource="{Binding Customers}" Grid.Row="1" > <namespc:SubListView.View> <GridView AllowsColumnReorder="True" ColumnHeaderToolTip="Some Tooltip" > <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="Auto" ></GridViewColumn> <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" Width="Auto" ></GridViewColumn> <GridViewColumn Header="Address" DisplayMemberBinding="{Binding Address}" Width="Auto" > </GridViewColumn> </GridView> </namespc:SubListView.View> </namespc:SubListView>
使用Style selector
Use of a Style Selector
关键实在ListView. ItemContainerStyleSelector,首先看实现。
The use of style selector uses on the ListView’s ItemContainerStyleSelector. First let’s see the ListViewItemStyleSelector
public class ListViewItemStyleSelector : StyleSelector { public override System.Windows.Style SelectStyle(object item, System.Windows.DependencyObject container) { Style st = new Style(); st.TargetType = typeof (ListViewItem); Setter backgroundSetter = new Setter(); backgroundSetter.Property = ListViewItem.BackgroundProperty; ListView listView = ItemsControl.ItemsControlFromItemContainer(container) as ListView; int index = listView.ItemContainerGenerator.IndexFromContainer(container); if (index%2 == 0) backgroundSetter.Value = Brushes.LightBlue; else { backgroundSetter.Value = Brushes.Beige; } st.Setters.Add(backgroundSetter); return st; } }
使用Style selector,我们希望作到如下
To use the StyleSelector, here is what you do
<!-- THe key is ItemContainerStyleSelector --> <ListView x:Name="ListViewWithStyleSelector" ItemsSource="{Binding Customers}" Grid.Row="2" ItemContainerStyleSelector="{DynamicResource myStyleSelector}" > <ListView.Resources> </ListView.Resources> <ListView.View> <GridView AllowsColumnReorder="True" ColumnHeaderToolTip="Some Tooltip" > <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="Auto" ></GridViewColumn> <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" Width="Auto" ></GridViewColumn> <GridViewColumn Header="Address" DisplayMemberBinding="{Binding Address}" Width="Auto" > </GridViewColumn> </GridView> </ListView.View> </ListView>
数据和DataContext
Data and DataContex
public class Customer { public string Name { get; set; } public int Age { get; set; } public string Address { get; set; } }
public class MainWindowViewModel { #region Fields private List<Customer> _customers; #endregion Fields #region Contructors public MainWindowViewModel() { Initialize(); } #endregion Constructors #region Methods public void Initialize() { _customers = new List<Customer>() { new Customer() { Name = "Joe", Address = "Hanhua", Age = 12, }, new Customer() { Name = "Nora", Address = "Hanhua", Age = 32, }, new Customer() { Name = "Karl", Address = "Huaihai", Age = 12, }, new Customer() { Name = "Summer", Address = "Huaihai", Age = 24, }, }; } #endregion Methods public CollectionView Customers { get { return new CollectionView(_customers); } }
References:
How to : Alternate the Background Color for rows in a ListView. http://msdn.microsoft.com/en-us/library/ms750769(v=vs.85).aspx
相关推荐
- 通过设置ListView的AlternationCount属性,可以实现行交替的背景色,提高可读性。 - 使用ItemContainerStyle来控制ListViewItem的样式,如鼠标悬停时的高亮效果。 5. **性能优化**: - 考虑使用...
对于ListView,我们可以创建一个全局样式,设定背景色、边框、字体等属性。例如,你可以通过以下代码定义一个ListView的基本样式: ```xml <Style TargetType="ListView"> ``` 2. **数据模板...
- **AlternationCount**: 为交替行设置不同的背景色,提高可读性。 - **HeaderTemplate**和**FooterTemplate**: 定义头尾部分的显示样式。 7. **性能优化** - **Virtualization**: 开启虚拟化(`...
- `<Style>`: 定义ListView的样式,包括背景色、边框、鼠标悬停时的样式变化等。 - `<GroupStyle>`: 如果有分组,定义分组的样式。 通过这个Demo,初学者可以了解如何创建一个具有自定义外观的ListView,并学习如何...
还有一些附加属性可以进一步定制 `ListView` 的行为,比如 `AlternationCount` 用于交替背景颜色,`IsSynchronizedWithCurrentItem` 用于同步列表视图和数据视图的当前项。 通过阅读和实践提供的 `...
在ListView中,隔行显示通常指的是通过改变奇偶行的背景颜色或者样式,使得用户可以更清晰地分辨出列表中的每一项。在C#中,我们可以使用WPF(Windows Presentation Foundation)或WinForms两种框架来实现这一功能,...
6.1.1 背景画刷和前景画刷 130 6.1.2 字体 132 6.1.3 鼠标光标 136 6.2 内容控件 137 6.2.1 Content属性 138 6.2.2 对齐内容 140 6.2.3 WPF内容原则 141 6.2.4 标签 142 6.2.5 按钮 142 6.2.6 工具提示 145 6.3 特殊...
6.1.1 背景画刷和前景画刷 130 6.1.2 字体 132 6.1.3 鼠标光标 136 6.2 内容控件 137 6.2.1 Content属性 138 6.2.2 对齐内容 140 6.2.3 WPF内容原则 141 6.2.4 标签 142 6.2.5 按钮 142 6.2.6 工具提示 145 6.3 特殊...
2. **AlternationCount**:此属性用于为ListView项提供交替的背景色,增加视觉效果。当设置一个非零值时,每AlternationCount个项将获得不同的背景颜色。 3. **GroupStyle**:当数据需要分组显示时,可以使用...