属性和事件是.NET抽象模型的核心部分, 而WPF中则用更高级的依赖项属性(Dependency Property)代替了原来.NET中的属性.依赖项属性主要应用于自定义元素中,用于为自定义元素注入自定义的属性.
1、定义依赖项属性,他是DependencyProperty类的实例。
静态属性: 由于依赖项属性需要在多个类之间共享,所以对象应该定义为与其相关联的类的静态字段。
public class InfoElement
{
public static readonly DependencyProperty MarginProperty;//依赖属性的定义
}
2、注册创建的依赖性属性。
static InfoElement()
{
// 设置元数据
FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(
new Thickness(),FrameworkPropertyMetadataOptions.AffectsMeasure);
// 属性的注册
// 参数: 属性名,属性使用的数据类型,拥有该属性的类型,元数据对象,验证属性的回调函数
MarginProperty = DependencyProperty.Register("Margin",
typeof(Thickness),typeof(InfoElement),metadata,
new ValidateValueCallback(InfoElement.IsMarginValid));
}
3、属性包装器:
public Thickness Margin
{
set { SetValue(MarginProperty,value);}
get {return (Thickness)GetValue(MarginProperty);}
}
4、属性验证
WPF中提供了两种方法来用于验证依赖属性的值。
1、ValidateValueCallback:该回调函数可以接受或拒绝新值。该值可作为DependencyProperty.Register方法的一个参数。
2、CoerceValueCallback:该回调函数可将新值强制修改为可被接受的值。例如某个依赖属性工作年龄的值范围是25到55,在该回调函数中,可以对设置的值进行强制修改,对于不满足条件的值,强制修改为满足条件的值。如当设置为负值时,可强制修改为0。该回调函数PropertyMetadata构造函数参数进行传递。
注册说明
Register方法有三种重载,如下:
名称 | 说明 |
Register(String, Type, Type) | 使用指定的属性名称、属性类型和属性所在对象的类型。 |
Register(String, Type, Type, PropertyMetadata) | 使用指定的属性名称、属性类型、属性所在对象的类型和属性元数据注册依赖项属性。 |
Register(String, Type, Type, PropertyMetadata, ValidateValueCallback) | 使用指定的属性名称、属性类型、属性所在对象的类型、属性元数据和属性的值验证回调来注册依赖项属性。 |
在Register中,各个参数解释如下:
String:依赖属性的名字(不加Property,即字段的名字);
Type:属性的类型;
Type:属性所属对象的类型;
PropertyMetadata:依赖项对象的属性元数据,是一个PropertyMetadata类型,可能赋初始值。PropertyMetadata有一个object的构造函数;
ValidateValueCallback:表示用作回调的方法,这个类型是一个委托,用于验证依赖项属性的值的有效性,因为是委托,故它的构造参数为一个方法名。
实例:
class MyClass : DependencyObject
{
// 属性定义和注册
public static readonly DependencyProperty MyfieldProperty = DependencyProperty.Register("Myfield", typeof(int), typeof(MyClass), new PropertyMetadata(0), new ValidateValueCallback(new MyClass().MyValidateMethod));
//属性设置
public int Myfield
{
get { return (int)GetValue(MyfieldProperty); }
set { SetValue(MyfieldProperty, value); }
}
// 属性验证
public bool MyValidateMethod(object value)
{
return true;//这里实现验证
}
}
一般将DependencyObject 配置为WPF中已有的控件类型,然后对其进行自定义依赖属性的设置,
例如自定义元素为MyButton,即拥有button控件的所有属性,也拥有自定义的属性
class MyButton : Button
{
// 属性定义和注册
public static readonly DependencyProperty MyfieldProperty = DependencyProperty.Register("Myfield", typeof(int), typeof(MyButton ), new PropertyMetadata(0), new ValidateValueCallback(new MyButton ().MyValidateMethod));
//属性设置
public int Myfield
{
get { return (int)GetValue(MyfieldProperty); }
set { SetValue(MyfieldProperty, value); }
}
// 属性验证
public bool MyValidateMethod(object value)
{
return true;//这里实现验证
}
}