Silverlight 自定义Pager

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 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值