一 依赖属性

在WPF库实现中,依赖属性使用普通的C#属性进行了包装,使得我们可以通过和以前一样的方式来使用依赖属性。但必须明确,在WPF中我们大多数都在使用依赖属性,而不是使用属性。依赖属性重要性在于,在WPF核心特性,如动画、数据绑定以及样式中都需要使用到依赖属性。WPF中的依赖属性主要有以下三个优点:
    依赖属性加入了属性变化通知、限制、验证等功能。这样可以使我们更方便地实现应用,同时大大减少了代码量。许多之前需要写很多代码才能实现的功能,在WPF中可以轻松实现。
    节约内存:在WinForm中,每个UI控件的属性都赋予了初始值,这样每个相同的控件在内存中都会保存一份初始值。而WPF依赖属性很好地解决了这个问题,它内部实现使用哈希表存储机制,对多个相同控件的相同属性的值都只保存一份。
    支持多种提供对象:可以通过多种方式来设置依赖属性的值。可以配合表达式、样式和绑定来对依赖属性设置值。

二 如何自己定义一个依赖属性

在C#属性定义的基础上;
    让依赖属性的所在类型继承自DependencyObject类;
    使用public static 声明一个DependencyProperty的变量,该变量就是真正的依赖属性;
    在类型的静态构造函数中通过Register方法完成依赖属性的元数据注册;
    提供一个依赖属性的包装属性,通过这个属性来完成对依赖属性的读写操作;

依赖属性是通过调用DependencyObject的GetValue和SetValue来对依赖属性进行读写的。它使用哈希表来进行存储的,对应的Key就是属性的HashCode值,而值(Value)则是注册的DependencyPropery;而C#中的属性是类私有字段的封装,可以通过对该字段进行操作来对属性进行读写。总结为:属性是字段的包装,WPF中使用属性对依赖属性进行包装。

三 依赖属性优先级

按从高到低排序:

1 属性系统强制转换。强制转换和动画在本 SDK 中都作用于称为“基值”的值。便于动画不受别的设置影响。
2 活动动画或具有 Hold 行为的动画。为了获得任何实用效果,属性的动画必须优先于基(未动画)值,即使该值是在本地设置的情况下也将如此。
3 本地值。本地值可以通过“包装”属性 (Property) 的便利性进行设置,这也相当于在 XAML 中设置 Attribute 或 Property 元素,或者使用特定实例的属性调用 SetValue API。如果您使用绑定或资源来设置本地值,则每个值都按照直接设置值的优先级顺序来应用。
4 TemplatedParent 模板属性。如果元素是作为模板(ControlTemplate 或 DataTemplate)的一部分创建的,则具有 TemplatedParent。在模板中,按以下优先级顺序应用:
    1 来自 TemplatedParent 模板的触发器。
    2 TemplatedParent 模板中的属性 (Property) 集。(通常通过 XAML 属性 (Attribute) 进行设置。)
5 隐式样式。仅应用于Style属性。Style属性是由任何样式资源通过与其类型匹配的键来填充的。该样式资源必须存在于页面或应用程序中;查找隐式样式资源不会进入到主题中。
6 样式触发器。来自页面或应用程序上的样式中的触发器。(这些样式可以是显式或隐式样式,但不是来自优先级较低的默认样式。)
7 模板触发器。来自样式中的模板或者直接应用的模板的任何触发器。
8 样式 Setter。来自页面或应用程序的样式中的 Setter 的值。
9 默认(主题)样式。在默认样式中,按以下优先级顺序应用:
    1 主题样式中的活动触发器。
    2 主题样式中的 Setter。
10 继承。有几个依赖项属性从父元素向子元素继承值,因此不需要在应用程序中的每个元素上专门设置这些属性。
11 来自依赖项属性元数据的默认值。任何给定的依赖项属性都具有一个默认值,它由该特定属性的属性系统注册来确定。而且,继承依赖项属性的派生类具有按照类型重写该元数据(包括默认值)的选项。因为继承是在默认值之前检查的,所以对于继承的属性,父元素的默认值优先于子元素。因此,如果任何地方都没有设置可继承的属性,将使用在根元素或父元素中指定的默认值,而不是子元素的默认值。

四 一个简单实例

<Pagexmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><Grid>  <Button x:Name="myButton" Background="Green" Width="400" Height="300"><Button.Style><Style TargetType="{x:Type Button}"><Setter Property="Background" Value="Yellow"/><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="Background" Value="Red" /></Trigger></Style.Triggers></Style></Button.Style>Click Me </Button></Grid>
</Page>

代码在三个地方设置了按钮的颜色;按钮最终为绿色;

初步了解WPF依赖属性相关推荐

  1. wpf 依赖属性和附加属性

    原文:wpf 依赖属性和附加属性 1.依赖属性 解释:依赖属性是配合binding出现的产物,功能主要是配合binding. 作用: 一.当自定义usercontrol时,需要与宿主(父窗体)双向绑定 ...

  2. WPF依赖属性(续)(1)

    之前有写过几篇文章,详细地介绍了依赖属性的基本使用方法,如果你不想了解其内部实现机制的话,那么通过那两篇文章的介绍,足以应付平时的应用了.关于其内部实现,博客园的周永恒也有人详细介绍过,还原了依赖属性 ...

  3. Wpf依赖属性和附加属性在样式中的应用

    文章目录 前言 一.依赖属性的使用方法 1.添加派生类(以Button为例) 2.修改样式模板 3.前台应用 二.依赖属性的使用方法 1.添加普通类 2.修改模板 3.前台使用 总结 前言 在wpf的 ...

  4. WPF依赖属性(二)

    转载自:http://www.cnblogs.com/chillsrc/p/4688983.html 六.依赖属性回调.验证及强制值 我们通过下面的这幅图,简单介绍一下WPF属性系统对依赖属性操作的基 ...

  5. 【demo练习二】:WPF依赖属性的练习

    2016-10-11 依赖属性demo小样: 要求:在窗口中点击按钮,利用设置"依赖属性"把Label和TextBox控件里的属性值进行改变. ================== ...

  6. WPF 依赖属性详解【转】

    我在上传些代码的时候,有时候会遇到“git did not exit cleanly (exit code 128)”错误.通常都是网络原因.

  7. WPF基础到企业应用系列8——依赖属性之“风云再起”

    一. 摘要 首先圣殿骑士很高兴"WPF 基础到企业应用系列" 能得到大家的关注.支持和认可.看到很多朋友留言希望加快速度的问题,我会尽力的,对你们的热情关注也表示由衷的感谢.这段时 ...

  8. WPF基础到企业应用系列7——深入剖析依赖属性(三)

    八. 只读依赖属性 我们以前在对简单属性的封装中,经常会对那些希望暴露给外界只读操作的字段封装成只读属性,同样在WPF中也提供了只读属性的概念,如一些 WPF控件的依赖属性是只读的,它们经常用于报告控 ...

  9. WPF快速入门系列(2)——深入解析依赖属性

    一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最 ...

最新文章

  1. mysql用户控制登录_MySql用户权限控制_MySQL
  2. Synergy软件的基本配置/使用(详细教程)
  3. P1031 均分纸牌(经典贪心)
  4. java程序员需要考证_泄题了!Java程序员最可能被考到的14个面试题
  5. jooq和jdbc_将jOOQ与JDBC比较
  6. Solidity 简易教程0x001
  7. 数据可视化可视化营养含量
  8. caffe提取每一层中的特征,在matlab或python查看
  9. jenkins JDK的集成
  10. MySQL数据库优化概述
  11. Input Director使用一个键盘和鼠标即可控制多台Windows计算机
  12. Java List集合排序 Java8 List集合排序方法 Java Lambda集合排序
  13. Wordpress鼠标指针样式自定义
  14. 开源IT监控系统对比
  15. 提起海洋和通海水域污染损害赔偿诉讼主体的几个层面
  16. 三菱plc支持c语言,5.三菱FX系列PLC支持哪种编程方式.
  17. Jenkins搭建.NET自动编译测试并实现半增量部署
  18. 附晋级总决赛名单(二) | 云上竞技,本周精彩继续
  19. 华为路由器时间同步_好用实在价格亲民 - 华为路由WS5200四核版初体验
  20. 我如何使用iPad作为学习工具

热门文章

  1. 安装opencv3.0.0与配置Visual studio 2008
  2. 中专学校的计算机教什么,中专计算机学校
  3. Java AffineTransform入门
  4. Doxygen生成注释文档
  5. STM32休眠后不能烧录程序
  6. 【生活】1024,快乐
  7. Python中的enumerate的用法
  8. 【分组背包问题 (HDU 3535 )】
  9. orth--将矩阵正交规范化
  10. Spring Boot配置IDEA无法创建Spring Initializr项目