Silverlight中MS有一个DataPager,不过用的是客户端分页和Asp.net中的GridView中分页思想一样,要进行服务端分页比较麻烦,因此我参考自己原来写的Flex分页写了一个自定义分页控件。
1.创建一个Silverlight 类库工程
2.创建一个Silverlight用户控件HahaPager
3.添加一个PageInfo类,用于保存分页相关信息
public class PageInfo { public int RecordCount { get; set; } public int PageSize { get; set; } public int PageIndex { get; set; } public int PageCount { get; set; } ///计算 public void Compute() { PageCount = RecordCount / PageSize; if (RecordCount % PageSize != 1) PageCount++; if (PageIndex > PageCount - 1) PageIndex = PageCount - 1; if (PageIndex < 0) PageIndex = 0; } public int StartIndex { get { return PageIndex * PageSize+1; } } public int EndIndex { get { var index = PageIndex * PageSize + PageSize+1; return index > RecordCount ? RecordCount : index; } } public bool IsFirst { get { return PageIndex == 0; } } public bool IsLast { get { return PageIndex == PageCount - 1; } } public bool IsInMiddle { get { return !IsFirst && !IsLast; } } }
4.HahaPager页面放置一个Label和四个按钮效果如下:
XMAL内容如下:
<UserControl x:Class="HahaPagerUI.HahaPager" 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" mc:Ignorable="d" d:DesignHeight="30" d:DesignWidth="505" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"> <Grid x:Name="LayoutRoot" Background="#FFEFECEC"> <sdk:Label HorizontalAlignment="Left" Margin="10,0,0,0" Name="label1" VerticalAlignment="Center" Content="共100条每页10条 共10页第1页" /> <Rectangle HorizontalAlignment="Stretch" Margin="1" Name="rectangle1" Stroke="Black" StrokeThickness="1" VerticalAlignment="Stretch" /> <Button Content="◀◀" HorizontalAlignment="Right" Margin="5,5,125,5" Name="btnF" VerticalAlignment="Stretch" Width="36" Click="btnF_Click" /> <Button Content="◀" HorizontalAlignment="Right" Margin="5,5,85,5" Name="btnP" Width="36" Click="btnP_Click" /> <Button Content="▶" HorizontalAlignment="Right" Margin="5,5,45,5" Name="btnN" VerticalAlignment="Stretch" Width="36" Click="btnN_Click" /> <Button Content="▶▶" HorizontalAlignment="Right" Margin="5,5,5,5" Name="btnL" VerticalAlignment="Stretch" Width="36" Click="btnL_Click" /> </Grid> </UserControl>
cs代码如下:
public partial class HahaPager : UserControl { //页码改变事件 public event EventHandler PageIndexChanged; public HahaPager() { InitializeComponent(); Pi = new PageInfo(); NavString = "共{RecordCount}条每页{PageSize}条 共{PageCount}页第{PageIndex}页"; } public PageInfo Pi { get; set; } //绘制导航信息 public void Render() { string tmp = NavString.Replace("{RecordCount}", "" + Pi.RecordCount) .Replace("{PageSize}", "" + Pi.PageSize) .Replace("{PageCount}", "" + Pi.PageCount) .Replace("{PageIndex}", "" + (Pi.PageIndex + 1)) .Replace("{StartIndex}", "" + Pi.StartIndex) .Replace("{EndIndex}", "" + Pi.EndIndex); label1.Content = tmp; btnF.IsEnabled = btnP.IsEnabled = !Pi.IsFirst; btnN.IsEnabled = btnL.IsEnabled = !Pi.IsLast; } //导航字符串 public string NavString { get; set; } //首页 private void btnF_Click(object sender, RoutedEventArgs e) { Pi.PageIndex = 0; Render(); if (PageIndexChanged != null) { PageIndexChanged(this, e); } } //上一页 private void btnP_Click(object sender, RoutedEventArgs e) { Pi.PageIndex--; Pi.Compute(); Render(); if (PageIndexChanged != null) { PageIndexChanged(this, e); } } //下一页 private void btnN_Click(object sender, RoutedEventArgs e) { Pi.PageIndex++; Pi.Compute(); Render(); if (PageIndexChanged != null) { PageIndexChanged(this, e); } } //末页 private void btnL_Click(object sender, RoutedEventArgs e) { Pi.PageIndex = Pi.PageCount - 1; Render(); if (PageIndexChanged != null) { PageIndexChanged(this, e); } } }
控件基本完成,测试效果界面:
测试相关代码:
//加载时绑定数据 private void LayoutRoot_Loaded(object sender, RoutedEventArgs e) { //第一页数据 BookDAL.FindAllByPage(0, 10, datas => { booksDataGrid.ItemsSource = datas; }); //获取页码 BookDAL.GetBookCount(data => { hahaPager1.Pi.RecordCount = data; hahaPager1.Pi.PageSize = 10; hahaPager1.Pi.Compute(); hahaPager1.Render(); }); } //页码改变时重新获取下一页数据 private void hahaPager1_PageIndexChanged(object sender, EventArgs e) { var pi=hahaPager1.Pi; BookDAL.FindAllByPage(pi.PageIndex, pi.PageSize, datas => { booksDataGrid.ItemsSource = datas; }); }
这只是初步实现!
封装了一个DLL,源码和封装后的DLL下载路径:
http://download.csdn.net/detail/lijun7788/4633746