定义依赖项属性
依赖项属性只能为依赖对象添加 (WPF中的元素等大部分基础结构都继承至DependencyObject)
依赖对象指继承至(DependencyObject)的类所定义的对象
- **定义表示属性的对象(DependencyProperty类的实例)。属性信息应该始终保持可用,
甚至需要在多个类之间共享这些信息,FrameworkElement 中定义了Margin属性,所有的元素都共享该属性。因此必须需要把DependencyProperty对象定义为与其相关联的类的静态字段。**
// FrameworkElement 中的Margin属性
public class FrameworkElement: UIElement,...
{
public class readonly DependencyProperty MarginProperty;
...
}
注册依赖性属性
- DependencyProperty没有public的构造函数,因此不能被直接实例化。实例化需要使用静态的DependencyProperty.Register()等方法创建其的实例。
- DependencyProperty对象创建后WPF为了不让改变对象,将DependencyProperty成员设置成只读的。他们的值必须使用Register方法的参数来提供。
注册依赖属性需要由两个步骤:
- 创建FrameworkPropertyMetadata 对象。这个对象描述了通过依赖项属性使用什么服务(数据绑定,动画,日志)
- 通过DependencyProperty.Register()静态方法注册属性。
//继续接上面的例子
//静态构造函数初始化MarginProperty
static FrameworkElement()
{
//创建FrameworkPropertyMetadata对象
FrameworkPropertyMetadata Metadata = new FrameworkPropertyMetadata(
new Thickness(),FrameworkPropertyMetadataOptions.AffectsMeasure //当一个元素的边距发生变化,布局容器就会重新布局,确定元素新布局
);
//注册属性
MarginProperty = DependencyProperty.Register(
"Margin", //属性名
typeof(Thickness), //属性使用的数据结构
typeof(FrameworkElement),//拥有该属性的类型,即当前类名
Metadata,//一个具有附加属性设置的FrameworkPropertyMetadata对象,该参数可选
new ValidataValueCallback(FrameworkElement.IsMarginValid) //验证属性的回调函数,可选。
)
}
添加属性包装器
使用传统的.Net属性封装WPF依赖项属性。需要使用DependencyObject基类中定义的GetValue()和SetValue()方法。
例子:
public Thickness Margin
{
set { SetValue(MarginProperty,value);}
get { return (Thickness)GetValue(MarginProperty);}
}
在上面的例子中不应当添加添加任何验证属性值的额外代码,引发事件的代码。这是因为WPF中的,直接调用SetValue()与GetValue()。验证操作应该放在DependencyProperty.ValidateValueCallback回调函数中,事件触发因在FrameworkPropertyMetadata.PropertyChangedCallback回调函数中进行。
下面由三点注意: