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();
        }        
    }

     

  • 相关阅读:
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    Java实现 LeetCode 803 打砖块 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    Java实现 LeetCode 803 打砖块 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    英文标点
    post sharp 与log4net 结合使用,含执行源码 转拷
  • 原文地址:https://www.cnblogs.com/yxhq/p/2581860.html
Copyright © 2011-2022 走看看