依赖项属性(Pro WPF学习)
1、定义依赖项属性
需要创建依赖项属性的地方:自定义WPF元素时;为不支持数据绑定、动画或其他WPF功能的部分代码添加这些功能时。
只能为依赖对象(继承自DependencyObject的类)添加依赖项属性。
属性信息应该始终保持可用,甚至需要在多个类之间共享这些信息,因此,必须将Dependency Property对象定义为与之相关联的类的静态字段。
public class SpaceButton : Button { public static readonly DependencyProperty SpaceProperty; ...... }
2、注册依赖项属性
需要在任何使用属性的代码之前完成,因此必须在与之关联的类的静态构造函数中进行。
注册一个依赖项属性需要两步:首先创建一个FrameworkPropertyMetadata对象,该对象指示希望通过依赖项属性使用什么服务(如支持数据绑定、动画及日志)。接下来通过调用DependencyProperty.Register()静态方法注册属性。
3、添加属性包装器
创建属性包装器时,应当只包含对SetValue()和GetValue()方法的调用
public class SpaceButton : Button { private string text; public string Text { get { return text; } set { text = value; Content = SpaceOutText(text); } } //依赖属性 public static readonly DependencyProperty SpaceProperty; //.net属性包装器 public int Space { set { SetValue(SpaceProperty, value); } get { return (int)GetValue(SpaceProperty); } } //静态构造函数 static SpaceButton() { //定义元数据 FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(); metadata.DefaultValue = 0; metadata.PropertyChangedCallback += OnSpacePropertyChanged; //继承。为true表示会通过元素树传播该依赖项属性值,并可以被嵌套的元素继承。如Font属性是一个可继承的依赖项属性, //如果在一个更高层次的元素中设置了Font属性值,则该属性会被嵌套的元素继承(除非使用自己的字体设置明确覆盖继承来的值) metadata.Inherits = true; //注册依赖项(属性名,属性使用的数据类型,该属性拥有者的类型, //一个具有附加属性设置的FrameworkPropertyMetadata对象[可选的]。 //一个用于验证属性的回调函数[可选的]) SpaceProperty = DependencyProperty.Register("Space", typeof(int), typeof(SpaceButton), metadata, ValidateSpaceValue); } //验证属性值的回调函数 static bool ValidateSpaceValue(Object obj) { int i = (int)obj; return i >= 0; } //属性值改变的回调函数 static void OnSpacePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { SpaceButton btn = obj as SpaceButton; string text = btn.Content as string; if (text == null) return; btn.Content = btn.SpaceOutText(text); } //该方法为字符间距添加空格 string SpaceOutText(string text) { if (text == null) return null; StringBuilder build = new StringBuilder(); foreach (char c in text) { build.Append(c + new string(' ', Space)); } return build.ToString(); } }