通过依赖属性来实现自定义控件的属性

来源:互联网 发布:淘宝客服搞笑欢迎语 编辑:程序博客网 时间:2024/05/20 08:43

 

今天,我想总结一些 关于用依赖函数 的方式,制作自定义控件的方法。

 比如说我现在想做一个ISCButton的自定义控件。那么首先,我需要建一个单独的项目专门来放着写自定义控件,在项目中重建UserControl,或者是类继承Button,或者是RadButton.

 写完以后就可以在其他项目上用了,可以通过拖拽自定义控件,也可以手工写,通过控件的域名,可以获得这个控件。运行一下,看能不能显示这个控件,如果可以显示,说明已经创建成功了。

     但是,我们只是通过继承实现了控件原有的方法,那么如果我们想自定义一个属性,在xaml中可以使用,可以被调用,并且可以绑定,该如何做呢,那么就需要依赖属性了。比如说我们现在要做一个Dialog 控件,里边有两个按钮,Ok,Cancel,并且当调用这个控件的Show方法的时候,让这个控件显示出一些信息。通过创建UserControl,我们可以在里边画一些我们需要的控件。页面做好以后, 开始写逻辑。比如说我需要有一个属性,当这个属性为True的时候,Dialog 控件的 Cancel按钮隐藏,如果为False的时候Cancel 按钮显示。那么,我们可以通过依赖属性来实现这个功能。在这个UserControl

的后台我们这样写:

      public static readonly DependencyProperty DisplayVisilityProperty = DependencyProperty.Register("CancelVisibility", typeof(Visibility), typeof(DialogBasic), new PropertyMetadata(new PropertyChangedCallback(OnVisibalityChange)));

      public static void OnVisibalityChange(DependencyObject d, DependencyPropertyChangedEventArgs e)

      {

         DialogBasic dialogBasic = d as DialogBasic;

         if(dialogBasic!=null)

         {

            dialogBasic.InvokeVisibalityChange();

         }

      }

      public Visibility CancelVisibility

      {

         get

         {

            return (Visibility)GetValue(DisplayVisilityProperty);

         }

         set

         {

            SetValue(DisplayVisilityProperty, value);

         }

 

      }

      private void InvokeVisibalityChange()

      {

         btn_Cancel.Visibility = this.CancelVisibility;

      }

     

      这样就完整的实现了这个依赖属性的功能。

      下面解释一下上边的这些方法,具体有什么用。

      1:public static readonly DependencyProperty DisplayVisilityProperty = DependencyProperty.Register("CancelVisibility", typeof(Visibility), typeof(DialogBasic), new PropertyMetadata(new PropertyChangedCallback(OnVisibalityChange)));

      这个就是我们定义的一个依赖属性 注意是Public static readonly类型,也就是他是一个公开的静态方法,并且它还是一个运行时执行的一个常量。通过调用Register发法来注册这个依赖属性。这个方法里边有4个参数,第一个参数,是属性名,第二个参数是,这个属性名的类型。一般是 typeof(类型)。

      第三个参数是你所注册的这个控件的类型。第四个参数是你需要实现什么操作。

      2:public Visibility CancelVisibility

                  {

                        get

                        {

                              return (Visibility)GetValue(DisplayVisilityProperty);

                        }

                        set

                        {

                              SetValue(DisplayVisilityProperty, value);

                        }

                  }

                  这个就是与之配套的 属性。因为我的需求是需要让Cancel 按钮隐藏,所以这个属性的类型是 Visibility。这样Register 方法的,第一个参数和第二个参数就有了。第三个参数是,你做定义的这个控件的控件名称。最后一个参数比较复杂,通过Rigister的提示,我们知道这个参数是metadata 的一个实例,

                  这个实例里边包含了一个可以callback 的PropertyChangedCallback的一个引用,也相当于一个委托。

                  public static void OnVisibalityChange(DependencyObject d, DependencyPropertyChangedEventArgs e)

                  {

                        DialogBasic dialogBasic = d as DialogBasic;

                        if(dialogBasic!=null)

                        {

                              dialogBasic.InvokeVisibalityChange();

                        }

                  }

                  这个委托有两个参数。DependencyObject d, DependencyPropertyChangedEventArgs e 。

                  第一个参数是DependencyObject  通过 DialogBasic dialogBasic = d as DialogBasic;

                  我们就可以获得这个控件的一个实例。

                  第二个参数是返回来的一些参数。NewValue ,OldValue,Property. 分别是新的值,老的值,还有获得当前的委托属性。

                  我们继续分析上面的方法。如果控件不为空,dialogBasic!=null。那么就调用 nvokeVisibalityChange()这个方法。

                  private void InvokeVisibalityChange()

                  {

                        btn_Cancel.Visibility = this.CancelVisibility;

                  }

                  在这里边我们终于看到了我们想要的。调用btn_Cancel.Visibility的属性,让btn_Cancel这个按钮显示,或者隐藏。

                 

                  这样我们就写好了。我们可以像使用其他属性一样在xaml中对这个值赋值,或绑定。