一:从实例入手之设置设置颜色交替显示的GridView(方法一)

本文介绍了一种使用WPF实现交替背景色GridView的方法。通过派生ListView并重写PrepareContainerForItemOverride方法,根据索引设置不同颜色背景。文章还详细解析了ItemContainerGenerator的作用。
摘要由CSDN通过智能技术生成

空洞的理论让人心烦。所以我打算从一个实例开始学习WPF。这个例子用来产生一个交替显示背景色的GridView。我看在网上有很多人都在问这样的问题,也有很多热心朋友的答复。但是所有这些答复都是基于MSDN网站上的描述。这是MSDN上的说明:http://msdn.microsoft.com/zh-cn/library/ms750769.aspx

 

我仍然使用这里例子作为对WPF的入门。当然了,我的重点不在如何实现交替显示背景色的GridView,而是以此入手,挖掘更多的WPF的知识。希望大家给出意见和建议,一起进步。

MSDN中有3种方法来实现了这一效果。这是其中的一个:派生一个新的ListView来实现交替产生背景色的效果。

这是定义的新的派生类源代码:

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Windows.Controls;
 6 using System.Windows.Media;
 7 
 8 namespace WPFGridColor
 9 {
10     class SubListView:ListView
11     {
12         protected override void PrepareContainerForItemOverride(System.Windows.DependencyObject element, object item)
13         {
14             //Comment:
15             // This method is called when the ListViewItem is preparing to display.
16             // It means that the method is based on the ListViewItem.
17             base.PrepareContainerForItemOverride(element, item);
18 
19             if (View is GridView)
20             {
21                 //Trying to get the index.
22                 //element represents the ListViewItem object, 
23                 //and we could get the current item's index by this method.
24                 int index = ItemContainerGenerator.IndexFromContainer(element);
25 
26                 ListViewItem lvi = element as ListViewItem;
27                 if (index % 2 == 0)
28                 {
29                     lvi.Background = Brushes.LightBlue;
30                 }
31                 else
32                 {
33                     lvi.Background = Brushes.Beige;
34                 }
35             }
36         }
37     }
38 }
39 

 

     可以看见,这里首先定义了一个派生自ListView的新类,在新类中重写了PrepareContainerForItemOverride方法。先看看PrepareContainerForItemOverride方法。在MSDN中的解释是:为ListViewItem设置样式、模板和绑定。在这里,应该注意两点:

  1. 它的作用对象是ListViewItem。即仅对其中的一个项起作用。在这里例子里面,可以理解为当要表示某一行时可以为这一行指定样式、模板和绑定。因此,它的参数中应该包含对这个ListViewItem的引用。
  2. 从名字上来说,方法的目的是Prepare Container for Item。 因此,这里是通过重载来设定ListVirewItem的样式、模板和绑定,进而最终影响Container的表示方式。

再进一步可以看见一个ItemContainerGenerator.IndexFromContainer。IndexFromContainer可以知道这是用来取得该ListViewItem在整个Container中的索引。但是ItemContainerGenerator是什么东西呢?MSDN的解释很难理解。这是我的看法:

  1. ItemContainerGenerator是ListView的一个属性。它的作用在于“负责为其宿主(如 ItemsControl)生成 用户界面 (UI)。它维护控件数据视图中的项与对应的 对象之间的关联。”。在这里我的理解是它可以定义ListView(准确的说应该是ItemsControl)与其中的ListViewItem的关系。
  2. ItemContainerGenerator作为一个维护ItemsControl与用户界面关系的桥梁,主要提供了以下方法:
    ContainerFromIndex     根据索引返回对应于ItemCollection中指定索引项的元素(DependencyObject)。
    ContainerFromItem      返回对应于指定项的UIElement。
    IndexFromContainer     返回对应于指定生成的 的项的索引。
    ItemFromContainer      返回对应于指定生成的UIElement 的项。
  3. 可以看出这里有两个非常重要的实体关系:ListView的UI对象集合ItemsControl和值的集合ItemCollection。ItemContainerGenerator处理的就是这两者之间的关系。
  4. ItemsControl是所有集合控件的主要成员。它需要一个容器类型作为宿主。如:ListView和ComboBox。
  5. 这里的Container其实就是UIElement。也就是在画面上看见的一行。

到这里,再理解整个SubListView就很容易了。现在再来看我们在xaml中的实现

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 <Window x:Class="WPFGridColor.MainWnd"
 2     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4     xmlns:appnmspc="clr-namespace:WPFGridColor"
 5     Title="WPF Grid Back Color Investigation" Height="300" Width="500">
 6     <Window.Resources>
 7         <XmlDataProvider x:Key="CustomersDS" Source="C:\data.xml" />
 8     </Window.Resources>
 9     <Grid>
10         <appnmspc:SubListView ItemsSource="{Binding Source={StaticResource CustomersDS}, XPath=/Customers/Customer}">
11             <appnmspc:SubListView.View>
12                 <GridView>
13                     <GridViewColumn DisplayMemberBinding="{Binding XPath=Code}" 
14                       Header="Code" Width="120"/>
15                     <GridViewColumn DisplayMemberBinding="{Binding XPath=Name}" 
16                       Header="Name" Width="120"/>
17                     <GridViewColumn DisplayMemberBinding="{Binding XPath=Country}" 
18                       Header="Country" Width="120"/>
19                 </GridView>
20             </appnmspc:SubListView.View>
21         </appnmspc:SubListView>
22     </Grid>
23 </Window>
24 

这里需要注意几点:

  1. 第四行,这是在引用自己定义的程序集。需要注意xaml的名称空间和程序集的名称空间的区别,以及如何在xaml中引用程序集的名称空间。
  2. 第六行,定义了一个该Window的资源。
  3. 第十行,使用数据源绑定。关于资源和数据源绑定,以后将会做进一步的研究。

 以派生类的方式实现背景色交替显示的GridView源代码

转载于:https://www.cnblogs.com/zhaoxb1982/archive/2009/02/01/1382075.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值