WPF里的DependencyProperty(1)

C#依赖属性深度解析:WPF开发的核心机制 / 1. 注册依赖属性"Text", // 属性名称typeof(string), // 属性类型typeof(CustomControl), // 所有者类型"Default Text", // 默认值// 值变更回调// 2. 包装器属性// 3. 值变更处理逻辑control?关键参数说明:控制绑定方向、继承行为等变更回调可实现数据验证、UI更新等扩展逻辑// 在UserControl中暴露可绑定属性允许第三方通过属性设置定制控件行为。实现声明式编程模型。 阅读详情
自己一个人学东西,怎么样才算会了?除了做东西,有两个检验的办法,第一是去给不懂的人讲,看看能不能把别人讲明白了,第二是写文章,看看理不理的清楚思路 呵呵
第一次尝试写些东西,,先在这儿贴出来再说~
不废话了,今天先发第一部份


 
一 引入DependencyProperty

这个概念可以说是WPF核心中的核心了。在WPF的框架中随时都能见到它的身影。关于DependencyProperty能带来的诸多方便,很多介绍性的文章里都有,我这里就不介绍了,今天先从什么是DependencyProperty说起。


从属性开始属性

在CLR中有属性(Property)这个概念,它可以用来封装字段。

private   string  _myString;
public   string  MyString
{
         
get{return _myString;}
        
set{_myString=value;}
}

 这种属性应用的非常多,我们还可以在set或get方法中加入某些逻辑,确定读取或者设置属性的值的时候我们是不是需要某些其他的判断,一个经典的例子是在Age属性的set方法中加入对年龄范围的判断。这些就不多说了。

但是WPF框架的编程经常和界面打交道,经常遇到的一个情况是某个属性的值的变化会影响到多个其他对象。比如当一个Button的改变大小超过了它的容器,他的容器应该自动调整大小。于是我们考虑在每个属性的set方法中触发一些事件,但很快我们发现现有的功能很难满足我们的需求,至少不能简洁漂亮的满足这些需求。
实际上我们的需求更加复杂,WPF中的数据绑定,XAML语法等很多地方都和属性密切相关,我们迫切需要一种功能更加强大的属性。

 于是在WPF中,引入了一种特殊的属性,Dependency Property。这种属性和普通的属性最大不同在于,它的值的来源并不单一。对这种属性的取值和赋值都会能与其他对象有影响,因此能得到很大的灵活性。

这很抽象,也许很难懂。不明白不要紧,先接着看。一步步来,先看看DependencyProperty长什么样,从定义DependencyProperty开始:

public   static   readonly  DependencyProperty MyStringProperty  =  DependencyProperty.Register(
            
" MyString " ,
            
typeof ( string ),
            
typeof (ClassMyDependency),
            
new  PropertyMetadata( " defaultValue " new  PropertyChangedCallback(onMyStringPropertyChange)));

一眼看上去很复杂,首先使用public static readonly的方式(其实就是设计模式里的单键 这是.net里的一种简单实现)定义了一个全局的DenpendencyProperty成员,这个成员的值通过DependencyProperty的Register方法获得,这个成员我们称做DependencyProperty标识。

我们传入了一些参数,分别表示属性名,属性类型,父元素(也就是包含属性的元素)类型,属性元数据(这些以后再详细介绍)。
要注意的是, 虽然我们定义的名称是MyStringProperty,但是属性的名称不是成员的名称,它由第一个参数指定.这个Property的后缀不是可选的,虽说不按照这个规则编译能通过,但是.net中很多地方都遵循了这种规则,这里我们了解这个规则并保证自己定义的DependecyProperty都遵循它就行了,以后会有更详细的解释.

实际上我们得到了一个属性的标识,这个数据是全局的且是唯一确定的,当需要访问属性的值时,只需要调用对象的GetValue()和SetValue()方法来访问()。语法是:

GetValue(property)
SetValue(property, value)

方法的调用者,不仅可以是定义DependencyProperty的对象,它可以是任何继承了DependencyObject的对象,换句话说,这个属性定义在了这里,但是它并不完全属于这个对象。这很不好理解,不过也正是DependencyProperty功能的强大之处之一,现在先不必深究这个。 
 
不过使用GetValue和SetValue方法给属性赋值让我们很不习惯,于是我们可以对这两个方法进行封装,在上面DependencyProperty的定义之后加上:

         public   string  MyString
        
{
            
get return (string)GetValue(myStringProperty); }
            
set { SetValue(myStringProperty, value); }
        }

这在 MSDN 中称为 ”CLR 封装 (wrapper)” ,这是可选的,不过经过封装之后,这样对于外界来说, DependencyProperty 就和传统属性没有什么区别了,实现了完全的“向下兼容”。 

  虽然我们还不很清楚DependencyProperty到底可以用来做什么,但现在为止至少已经实现了传统属性的所有功能,注意到,我们并没有定义那个private的私有字段。实际上,.net自动为我们创建了用来存储属性值的区域,这是一种基于Hash的数据存储机制,效率肯定低于传统属性,不过这些效率损失不足以影响我们。插一句,牺牲一点点性能来换取强大的功能是DotNet的一贯做法,呵呵

 关于为DependencyProperty的赋值,实际上和传统的属性没有太大区别,XAML和 code中都可以为其赋值:
code中就不介绍了,和传统属性赋值相同,在XAML中,使用一个XML属性即可:
<l:ClassMyDependency MyString="11111" MyString1="22222" x:Key="myclass" />

l是实现定义的名字空间前缀,MyString是一个DependencyProperty,MyString1是一个普通属性,实际上这两个属性都能实现XAML下的赋值。
这一句XAML如果翻译成C# code大概是这个样子:

        ClassMyDependency myclass  =   new  ClassMyDependency();
        myclass.MyString
= " 11111 " ;
        mycalss.MyString1
= " 22222 " ;

网上有一些地方介绍说DependencyProperty主要功能是为了能让XAML代码为后台属性赋值,这是错误的。
不过使用XAML使用DependencyProperty也是有道理的。至于具体为什么,我准备在后续的POST里面会详细的说明。

 

好了,就这么多。今天的第一篇里,我们看到了DependencyProperty的样子,大概了解它的定义,它的存储方式。不过事实上我们到现在还并不知道这到底能用在什么地方。下一篇POST中我准备介绍一下DependencyProperty的一些用途,并且从用途出发看看一下它是如何完成这些看似有点不可思议的功能的。

iOS开发者必备:从越狱设备提取IPA的三种方法(含Filza、iTools实战) 本文详细介绍了iOS开发者从越狱设备提取IPA文件的三种实用方法,包括使用Filza文件管理器、AFC2配合桌面工具以及命令行高级技术。内容涵盖环境准备、操作步骤和技术原理,帮助开发者高效获取应用包文件,适用于逆向工程、测试分析等场景。 阅读详情

相关推荐

电动转向系统 TAS 传感器

靠扭杆变形测力气,用霍尔效应算角度,借 ECU 给电机发指令。它就像 EPS 系统的 "神经末梢",把驾驶员的操作意图转化成电信号,再通过电机变成实实在在的助力,让我们开车既省力又安全。下次转动方向盘时,不妨想想这个藏在转向柱的 "小传感器"—— 正是它的精准感知,才有了每一次顺畅的转向体验。

weixin_59825476的博客 4016

C# WPF DependencyProperty程序

C# WPF DependencyProperty程序,方便程序的理解。https://mp.csdn.net/postedit/87916547

实现WPF依赖属性的Visual Studio 2017 C# WPF演示项目

是一种特殊的属性,由WPF提供,使得属性值可以依赖于其他属性值,或在运行时被更改变更。这种属性由类定义,它支持在不同对象实例之间共享属性值,并允许属性值通过数据绑定、样式、动画等手段进行动态变更。// 示例:创建一个DependencyProperty// 当属性值改变时触发的回调逻辑在上述代码示例中,方法用于声明一个依赖属性。Register方法需要至少四个参数:属性名称、类型、所属类和属性元数据对象(对象提供了属性值改变时的回调逻辑,这是实现属性更改通知的关键。

weixin_35414484的博客 545

C# WPF中的DependencyProperty介绍

  参考文章https://www.cnblogs.com/flypig/articles/2158833.html 这先介绍格式: public string MyString { get { return (string)GetValue(MyStringProperty); } set { SetValue(MyStr...

yanxiaoyunsana的博客 1万+

C#小知识(篇章二)UpDateing

C#小知识

qq_43590078的博客 720

剖析依赖属性

剖析依赖属性 Dependency Property## 【了解属性和字段】 我们知道,属性是面向对象语言中用来封装字段的外衣,它像是字段对外界的桥梁,我们可以通过属性来验证数据的合法性或控制对外的访问性等等。每个属性的背后都有其对应的一个字段做支撑,就算是自动属性,在编译时系统也会创建其字段,只不过自动属性是微软给我们的语法糖罢了。在C#中,属性最后是会编译成两个方法:get_属性名和set_属性名(如果是只读属性,则没有set方法,反之没有get方法)。 编译成方法,属性就不会占用太多空间,因为方法存在

kalvin_y_liu的博客 1468

WPFDependencyProperty(1)

 自己一个人学东西,怎么样才算会了?除了做东西,有两个检验的办法,第一是去给不懂的人讲,看看能不能把别人讲明白了,第二是写文章,看看理不理的清楚思路 呵呵第一次尝试写些东西,,先在这儿贴出来再说~不废话了,今天先发第一部份一 引入DependencyProperty 这个概念可以说是WPF核心中的核心了。在WPF的框架中随时都能见到它的身影。关于DependencyProperty能带来的

北京动点飞扬软件 1135

STM32N6570裸机I3C驱动移植:VL53L9 ToF传感器从V4L2到MCU实战

在嵌入式系统设计中,传感器驱动开发往往面临从Linux平台向MCU平台迁移的挑战。以V4L2架构为例,其高度的模块化设计在裸机环境下无法直接复用,开发者需要重新构建底层通信与中断处理机制。I3C作为新一代串行通信协议,凭借12.5MHz的传输速率、带内中断(IBI)和动态地址分配(DAA)等特性,成为高性能传感器(如ToF测距芯片)的理想总线选择。通过分析VL53L9的寄存器操作与数据输出逻辑,结合STM32N6570的DMA与中断控制,可以实现从V4L2+I2C到裸机I3C的完整驱动移植。这一过程不仅涵盖

weixin_30363981的博客 427

WPF 依赖属性 DependencyProperty

依赖属性 在WPF中使用了更高级的依赖项属性替换了.net中的属性。依赖属性具有一些更高效的保存机制,同进支持附加功能,如 更改通知(Change Notification)以及属性值继承(在元素树中向下传递默认属性值)。依赖属性同样还是WPF中Animation,Binding,Style的重要基础。

dearbigdog的博客 8600

WPFDependencyProperty(2)

WPFDependencyProperty(2) 废话照例,每篇开头都说些废话。一年前写了一篇.Net3.0DependencyProperty1),没下文了,很对不起大家。是啊,都是一年前的事情了。这一年中发生了很多事情……()……,最近终于又有空开始研究WPF了。一年过去,WPF发布了3.5版本,有了许多不大不小的改变,我准备接着去年的进度,继续研习下去,现在就先试着把去年

pnuts的专栏 526

wpf DependencyProperty? 方便查询用

WPF、Silverlight 和 UWP 等 XAML 平台的核心属性系统。它不是一个普通的 .NET 属性,而是一个在依赖对象中注册并由 WPF 属性系统管理的属性。你可以把它理解为对普通 CLR 属性的一个“增强版”。样式设置数据绑定动画动态资源引用属性值继承这是最常见的使用场景。当你创建一个新的或从Control类继承来制作自定义控件时,你需要使用来定义控件的属性,这样这些属性才能享受到 WPF 属性系统的所有高级功能。为一个自定义的“圆形按钮”控件添加一个属性。csharp复制。

zm_struggle的博客 894

WPF中DependencyObject与DependencyProperty的源码简单剖析

Windbg调试WPF的依赖属性中提到了wpf的DependencyObject中DependencyProperty是如何调试查看的。从中我们看出DO(DependencyObject)与 DP(DependencyProperty)一些内部实现。这篇文章我们就从源码入手, 让大家了解下依赖对象中依赖属性的值的获取和赋值。我们先看个DP注册的例子:public class MyStateCont

muzizongheng的专栏 5444

DependencyProperty

转载自: http://www.cnblogs.com/yayx/archive/2007/05/26/761117.html http://www.cnblogs.com/yayx/archive/2008/04/20/1162963.html http://www.cnblogs.com/yayx/archive/2008/04/22/1166064.html 一 引入Dep...

weixin_30660027的博客 236

依赖属性(Dependency Property)

用一句话概括DependencyProperty对象的创建与注册,那就是:创建一个DependencyProperty实例并用它的CLR属性名和宿主类型名生成hash code,最后把hash code 和DependencyProperty实例作为Key-Value存入全局的、名为PropertyFromName的Hashtable中,这样,WPF属性系统通过CLR属性名和宿主类型名就可以从这个全局的Hashtable中检索出对应的DependencyProperty实例。这句话的函数嵌套比较深,展开。

m0_59115955的博客 1209

从源码角度解析依赖属性

什么是依赖属性? 依赖属性是属性的全新实现,它是在C#属性的基础上包装而成。 从源码盘它 我们从system.windows 源码,可以注意到因为DependencyProperty类没有公有 的构造函数。反而只能使用静态的DependencyProperty.Register()方法创建 那我们看看最复杂的Register方法,可以看到有属性名Name,属性类型,拥有者类型,以及默认元数据值以及验证回调函数。 我们也可以观察到它调用了个RegisterCommon方法,进行了简单的传参,我们继续看看

码农01号的博客 1135

依赖属性 DependencyProperty

解决的问题:一个控件可能有几百个CLR属性,如果每个CLR属性都是包装一个字段,那么这个控件耗费的内存太大了。依赖属性就是解决这个问题的。 如何解决这个问题:使控件的CLR属性不是包装字段,而是包装一个DependencyProperty,并且这个DependencyProperty的内存不是分配在控件内,而是采用某种机制分配在外部,以key-value的形式存在。另外,DependencyPr...

weixin_33676492的博客 1439

C#中的CLR属性、依赖属性与附加属性

CLR属性是C#中的关键特性,提供封装性、访问控制和验证逻辑。编译后转换为get/set方法,自动属性进一步简化语法。相比依赖属性,CLR属性存储直接,而依赖属性支持绑定、动画等高级功能。依赖属性通过DependencyObject实现值继承和优先级系统,附加属性则允许跨类扩展功能。两者是XAML技术的核心,适用于控件开发和数据绑定等场景。CLR属性保持了简洁语法与灵活控制的平衡,是面向对象编程的基础设施。

追赶时代的博客 1313

基于STM32的智能家居控制系统.pdf

基于STM32的智能家居控制系统.pdf

上一篇: WPF中的DoubleAnimation
下一篇: WPF里的DependencyProperty(2)
pnuts
博客等级 码龄19年 6粉丝 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值