Silverlight 自定义控件 模板化控件 (一)属性

以前写ASP.NET winfrom 总想自己写自定义控件,一直也没机会写。心里挺痒痒的,最近用silverlight做项目。也没怎么用过silverlight硬着头皮看资料。看官方的开源扩展包。国内也没有比较好,比较全的这个资料吧。既然自己学会了就和大家分享下吧。

     

      以 DataPager控件为示列 ,由简入繁,此篇里面主要是继承原有模板化控件。主要讲述。既有控件如何公开一个新属性。后续会介绍更详细的。

    

     为原有DataPager控件隐藏原有的PageCount属性,公开新的PageCount的属性。

      原有的PageCount属性只具有只读属性,现在新的PageCount属性具有读和写的属性。

 

      新建Silverlight项目SLToolkit的类库项目,

      并新建DataPager类, 并继承微软的DataPager类    

 

在Tools项目中新建文件夹Tools

然后建立DataPager类该类继承与System.Windows.Controls.DataPager。需引用System.Windows.Controls.Data

如图:

Silverlight 自定义控件 模板化控件 (一)属性_第1张图片

     添加如下引用

     System.Windows.Data  
  System.Windows.Controls.Data

如没有请安装Microsoft Silverlight 4 Toolkit

 

我们这里只对System.Windows.Controls.DataPager内部进行改造,用过DataPager的人都应该知道PageCount属性只具有只读。这点让咱们以前用惯非微软分页控件的人感觉很不舒服(以前ASP.NET中我都用的吴起娃的分页控件)。PageCount要是能自己指定多好啊。那么咱们下面来改造它吧!

       

using System;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Ink;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.Collections.Generic;

using System.Windows.Data;

 

namespace SLToolkit

{

    public class DataPager : System.Windows.Controls.DataPager

    {

        #region 定义总条数

        /// <summary>

        /// 定义总条数

        /// </summary>

        public new int PageCount

        {

            get { return (int)this.GetValue(PageCountProperty); }

            set

            {

                this.SetValue(PageCountProperty, value);

                            }

        }

        public static new DependencyProperty PageCountProperty = DependencyProperty.Register("PagerPageCount", typeof(int), typeof(DataPager), new PropertyMetadata(0, PageCountPropertyChangedCallback));

        private static void PageCountPropertyChangedCallback(DependencyObject obj, DependencyPropertyChangedEventArgs arg)

        {

            DataPager dataPager = obj as DataPager;

            dataPager.Bind();

        }

        #endregion

 

        /// <summary>

        /// 指定页数后重新绑定总页数

        /// </summary>

        public void Bind()

        {

            int totalpagers = PageCount;

            List<int> itemCount = new List<int>();//用于DataPager的数据提供

 

            for (int i = 1; i <= totalpagers; i++)

            {

                itemCount.Add(i);

            }

            PagedCollectionView pagedCollectionView = new PagedCollectionView(itemCount);

            pagedCollectionView.PageSize = PageSize;

            this.Source = pagedCollectionView;

 

 

 

注意要点:

  public new int PageCount这个写法是隐藏System.Windows.Controls.DataPagerr的 PageCount属性。

 

 

依赖项

定义一个依赖项PageCountProperty 还需要为其注册。

public static DependencyProperty PageCountProperty = DependencyProperty.Register("PagerPageCount", typeof(int), typeof(DataPager), new PropertyMetadata(0, PageCountPropertyChangedCallback));

后面DependencyProperty.Register的参数一次为注册名称,注册类型,像哪个类注册(控件就是一个类),

PropertyMetadata能设置默认值和回调函数。

这里我们应用的特定类型是一个回调函数,当PageCount发生改变时会执行该回调函数。回调函数执行指定页数后重新绑定总页数。

 

以上代码完成扩展封装System.Windows.Controls.DataPager控件。

 

 

那么封装完毕后我们如何应用新封装的这个控件呢?

我们来看一下XMAL文件。

<UserControl x:Class="SLAPPTest.MainPage"

    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:MyCtrl="SLTOOl"

    mc:Ignorable="d"

    xmlns:SLToolkit="clr-namespace:SLToolkit;assembly=SLToolkit"

    d:DesignHeight="300" d:DesignWidth="400">

 

    <Grid x:Name="LayoutRoot" Background="White">

        <StackPanel >

            <SLToolkit:DataPager  PageSize="10" PageCount="1000" BorderBrush="#e8e8e8" Width="950" DisplayMode="FirstLastPreviousNextNumeric"  NumericButtonCount="10"></SLToolkit:DataPager>

            <SLToolkit:DataPager  PageSize="10" PageCount="5000" BorderBrush="#e8e8e8" Width="950" DisplayMode="Numeric"  NumericButtonCount="20"></SLToolkit:DataPager>

        </StackPanel>

    </Grid>

</UserControl>

 

   xmlns:SLToolkit="clr-namespace:SLToolkit;assembly=SLToolkit"

这个是为刚才写的控件导入CLR命名空间的。


是不是很简单。一个改造后的DataPager  就出来了。改造后的DataPager  具有直接给定总条数进行自动分页的功能了。

Silverlight 自定义控件 模板化控件 (一)属性_第2张图片

源码下载 http://download.csdn.net/source/3332251 

  

你可能感兴趣的:(Microsoft,Class,asp.net,扩展,silverlight,tools)