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

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

2021-03-28 Windows程序

Windbg调试WPF的依赖属性中提到了wpf的DependencyObject中DependencyProperty是如何调试查看的。

从中我们看出DO(DependencyObject)与 DP(DependencyProperty)一些内部实现。


这篇文章我们就从源码入手,, 让大家了解下依赖对象中依赖属性的值的获取和赋值。


我们先看个DP注册的例子:

public class MyStateControl : ButtonBase { public MyStateControl() : base() { } public Boolean State { get { return (Boolean)this.GetValue(StateProperty); } set { this.SetValue(StateProperty, value); } } public static readonly DependencyProperty StateProperty = DependencyProperty.Register( "State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false)); }


上述Code中MyStateControl是DO,StateProperty是DP


1.

当MyStateControl进行初始化, 首先会执行StateProperty, 因为它是静态字段。从而执行DependencyProperty.Register方法。


2.

这个方法内部调用了DP的构造方法, Code如下:

  // Create property

            DependencyProperty dp = new DependencyProperty(name, propertyType, ownerType, defaultMetadata, validateValueCallback);

3.

DP的构造方法如下:

  private DependencyProperty( string name, Type propertyType, Type ownerType, PropertyMetadata defaultMetadata, ValidateValueCallback validateValueCallback)

        {

            _name = name;

            _propertyType = propertyType;

            _ownerType = ownerType;

            _defaultMetadata = defaultMetadata;

            _validateValueCallback = validateValueCallback;


            Flags packedData;

            lock (Synchronized)

            {

                packedData = (Flags) GetUniqueGlobalIndex(ownerType, name);


                RegisteredPropertyList.Add( this);

            }


            if (propertyType.IsValueType)

            {

                packedData |= Flags.IsValueType;

            }


            if (propertyType == typeof (object))

            {

                packedData |= Flags.IsObjectType;

            }


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