zoukankan      html  css  js  c++  java
  • 依赖项属性(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();
        }        
    }

     

  • 相关阅读:
    Dart语言学习笔记(5)
    使用 Dart 调用 REST API
    JSON数据的解析和生成(Dart)
    趣味编程:静夜思(Dart版)
    正则表达式(Dart)
    Dart语言学习笔记(4)
    Dart语言学习笔记(3)
    C++11特性之右值引用
    各大编程字体比较
    优先队列的应用 C++实现
  • 原文地址:https://www.cnblogs.com/yxhq/p/2581860.html
Copyright © 2011-2022 走看看