wpf学习笔记 依赖属性
临毕业进入长沙一家公司实习,项目比较紧,希望能利用下班前的一点时间做更多的学习,所以以后的内容都将十分简单,十五分钟搞定。
依赖属性是WPF引入的新概念,基本形式如:
public int MyProperty
{
get { return (int)GetValue(MyPropertyProperty); }
set { SetValue(MyPropertyProperty, value); }
}
// Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new UIPropertyMetadata(0),new ValidateValueCallback(ValidateValue));
{
get { return (int)GetValue(MyPropertyProperty); }
set { SetValue(MyPropertyProperty, value); }
}
// Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new UIPropertyMetadata(0),new ValidateValueCallback(ValidateValue));
内容比较长,可以利用snippet迅速地构建这段代码,即输入prop之后连续摁Tab,稍加修改后即可。
我们通过Register方法的五个参数来了解依赖属性的内容。
简单的来说,可以把依赖属性当成是一个键值对表。第一个参数
"MyProperty",与MyProperty是同名且联动的,即可理解为表中的键。第三个参数 new UIPropertyMetadata(0) 即为值。其中UIPropertyMetadata在这里以0为默认参数。第二个参数指明了该属性值的类型,需要注意的是,
UIPropertyMetadata 中默认值的类型需要与此参数类型相同。第五个参数为验证方法。第三个参数比较重要,其揭示了依赖属性的机制。我们所使用的控件都是一一继承的,一直可以追溯到最根部的元素。那么每一次继承时,都会将祖先的值保留下来,并继承下去,经过若干此继承,这个控件的内存占用就十分恐怖了。于是就有这套机制来解决这个问题。
wpf中子控件会直接读祖先的值,而不是复制。但这个子孙则无法重写覆盖某些值,wpf的依赖属性加入了子类的类型,并通过一定地运算来标识该类的属性,即
typeof(ownerclass)。