WPF=Code+Markup 笔记 8

8 依赖属性

 

依赖属性,Dependency Property

在使用上只需注意两点:

在一棵XAML视觉树上

       1.当一个对象被明确设定依赖属性时,它的子孙都得到同样的属性

       2.如果某个对象被明确设定属性,它就不再沿袭父亲的这个属性。此后,再改变父亲的属性,这个对象也不再受影响。

 

 

Control类的FontSize属性的思考:

    public class Control : FrameworkElement

    {

        double fontSize = 11;

 

        public double FontSize

        {

            get

            {

                return fontSize;

            }

            set

            {

                fontSize = value;

                ……

            }

        }

    }

 

set写属性时,省略一些代码,用来激发其他事件。这里需要一种机制,以真正省略这些代码——这就是依赖属性的用意。

 

为此建立public而且static的只读字段FontSizeProperty,从而这个字段是和类相关而不是关联到对象,而且它只能在静态构造函数中被设定。

 

    public partial class Control : FrameworkElement

    {

        public static readonly DependencyProperty FontSizeProperty;

 

        static Control()

        {

            FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();

            metadata.DefaultValue = 11;

            metadata.AffectsMeasure = true;

            metadata.Inherits = true;

            metadata.IsDataBindingAllowed = true;

            metadata.DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

 

            FontSizeProperty = DependencyProperty.Register("FontSize", typeof(double), typeof(Control), metadata, ValidateFontSize);

        }

 

        static bool ValidateFontSize(Object obj)

        {

            double dFontSize = (double)obj;

            return dFontSize > 0 && dFontSize < 35791;

        }

    }

 

注意这个对象的建立,使用了DependencyProperty.Register静态方法。

重载方法1

            FontSizeProperty = DependencyProperty.Register("FontSize", typeof(double), typeof(Control));

三个参数分别为“和此依赖属性关联的名称字符串”、“属性的数据类型”、“注册此属性的类别”。

重载方法2

            FontSizeProperty = DependencyProperty.Register("FontSize", typeof(double), typeof(Control), metadata, ValidateFontSize);

多了两个参数,讨论如下

有时候还需要metadata,来描述这个属性的重要信息。其中DefaultValue用来取代私有字段fontSizeAffectsMeasure一般设置为true,会使得FontSizeset属性设置时,以新的FontSize进行重绘;Inherits则影响这个控件以下的所有子孙,在FontSizeset属性设置时,将这个新的FontSize值向下传。

ValidateFontSize这个callback方法,则用于FontSizeset属性设置时调用,以决定这个值是否合适。不合适也就是返回方法返回false,就抛出一个异常。

 

此时,改写FontSize属性,使其不再依赖私有字段fontSize,而是依赖于FontSizeProperty字段,并通过GetValeSetValue这两个派生于DependencyObject的方法来操作,里面省略了一些内部处理的代码,包括很多事件的触发,如设置属性时对窗体重绘和子孙的影响。

    public partial class Control : FrameworkElement

    {

        public double FontSize

        {

            get

            {

                return (double)GetValue(FontSizeProperty);

            }

            set

            {

                SetValue(FontSizeProperty, value);

            }

        }

    }

 

 

自定义一个依赖属性

仿照对Control类的研究,设计一个带有依赖属性SpacePropertySpaceButton

    public class SpaceButton : Button

    {

        // A DependencyProperty and public property.

        public static readonly DependencyProperty SpaceProperty;

 

        public int Space

        {

            set

            {

                SetValue(SpaceProperty, value);

            }

            get

            {

                return (int)GetValue(SpaceProperty);

            }

        }

 

        // Static constructor.

        static SpaceButton()

        {

            // Define the metadata.

            FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();

            metadata.DefaultValue = 1;

            metadata.AffectsMeasure = true;

            metadata.Inherits = true;

            metadata.PropertyChangedCallback += OnSpacePropertyChanged;

 

            // Register the DependencyProperty.

            SpaceProperty =

                DependencyProperty.Register("Space", typeof(int),

                                            typeof(SpaceButton), metadata,

                                            ValidateSpaceValue);

        }

 

        // Callback method for value validation.

        static bool ValidateSpaceValue(object obj)

        {

            int i = (int)obj;

            return i >= 0;

        }

 

        // Callback method for property changed.

        static void OnSpacePropertyChanged(DependencyObject obj,

                                    DependencyPropertyChangedEventArgs args)

        {

            SpaceButton btn = obj as SpaceButton;

            btn.Content = btn.SpaceOutText(btn.txt);

        }

}

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15123181/viewspace-422967/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15123181/viewspace-422967/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值