当前位置:首页 > Windows程序 > 正文

WPF,Silverlight与XAML读书笔记第七

2021-05-26 Windows程序

说明:本系列基本上是《WPF揭秘》的读书笔记。在结构安排与文章内容上参照《WPF揭秘》的编排,对内容进行了总结并加入一些个人理解。

WPF引入了一种新的属性类型依赖属性。依赖属性用于整个WPF平台,用来实现样式化,自动属性绑定,动画等。详细说即使用属性替代方法和事件处理对象的行为,通过属性驱动来加强系统的行为。如将属性绑定到数据源来驱动用户界面的显示。

依赖属性可以发挥作用的场合如:将一个属性绑定到另一个对象的某属性,要求当被绑定的属性改变时,依赖于那个属性的属性会自动改变(这要求双方均支持属性绑定)。另一个场景是继承可以被继承的属性(如常见的字体大小属性),要求当父对象变化时,子对象属性作相应变化。另外依赖属性在模版中也发挥着重要作用,使用依赖属性可以将模版中的属性封装起来,并应用到为各个控件建立的模版,这样就可以使这些控件在风格上实现统一(其内部原理是,控件继承了模板的属性来保证相对的一致性,当然也可以添加自己的属性,以实现自身所需展现的内容)。

    依赖属性在任何时刻都依靠多个提供程序来判断它的值。这些提供程序可以是一段一直在改变值的动画,或者一个父元素的属性值由上而下传递给子元素。依赖属性的最大特征是其内建的传递变更通知(change notification)的能力。

依赖属性给程序带来的最大特点是,其更有利于用声明式代码(如XAML)进行程序设计。声明式代码中属性的设置是实现程序很重要的途径。有了依赖属性(对传统属性的增强),声明式代码才可以通过设置属性的方式获得原来过程式代码才能提供的如属性的垂直传递,变更通知等高级特性。

依赖属性的实现

依赖属性完全由WPF API实现,只有XAML天生可以理解依赖属性,对应到过程式代码,依赖属性仅是.NET属性的一种增强。

下面代码演示了在Button中实现一个叫IsDefault的依赖属性。

public class Button : ButtonBase {     //依赖属性     public static readonly DependencyObject IsDefaultProperty;       static Button()     {         //注册属性         Button.IsDefaultProperty   = DependencyProperty.Register("IsDefault",                                                                 typeof(bool),                                                                  typeof(Button),                                                                 new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnIsDefaultChanged))             );     }       //.NET属性包装器(可选)     public bool IsDefault     {         get {   return (bool)GetValue(Button.IsDefaultProperty); }         set {   SetValue(Button.IsDefaultProperty, value); }     }       //属性改变的回调(可选)     private static void   OnIsDefaultChanged(DependencyProperty o, DependencyPropertyChangedEventArgs e)     { } }

分析:

    代码中IsDefaultProperty静态成员是依赖属性,所有依赖属性都是System.Windows.DependencyProperty类的对象,则其必须是public static且使用Property作为名称的后缀。声明过依赖属性后,,要通过调用DependencyProperty.Register方法来创建。这个函数有3个必选的参数。

1) 名称,不带Property的依赖属性变量名。如上面代码对应名称为IsDefault。

2) 此依赖属性的类型,对应上文代码即是bool。

3) 拥有这个属性的类,对应Button。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/71272.html