WPF中DependencyObject与DependencyProperty的源码简单剖析
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
- 上一篇:Windows2008 IIS配置FTP站点
- 下一篇:WIN10安装与升级的方法