• 《WPF程序设计指南》读书笔记——第8章 依赖属性


    1.依赖属性的效果
    一旦规定视觉树上一个对象的fontsize属性,那么属于他的节点之下的所有对象都会沿袭这个属性,然而如果某个子节点明确的设定了自己的fontsize,就不会沿袭父节点的fontsize属性。fontsize这个属性是在Contorl中定义的,它具有默认值,默认的值优先级最低,从父节点上沿袭来的fontsize优先级比默认高,而直接对对象本身进行设置的优先级最高。类似fontsize属性的这类属性就是依赖属性
    2.依赖属性的实现

     

    using System;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;
    using System.Windows.Media;
    
    namespace LY.SetSpaceProperty
    {
        public class SpaceButton : Button
        {
            //传统的字段和属性
            string txt;
    
            public string Text
            {
                set
                {
                    txt = value;
                    Content = SpaceOutText(txt);
                }
                get
                {
                    return txt;
                }
            }
    
            //依赖属性
            public static readonly DependencyProperty SpaceProperty;
    
            public int Space
            {
                set
                {
                    SetValue(SpaceProperty, value);
                }
                get
                {
                    return (int)GetValue(SpaceProperty);
                }
            }
    
            //用静态构造函数初始化
            static SpaceButton()
            {
                //定义元数据
                FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
                metadata.DefaultValue = 1;
                metadata.AffectsMeasure = true;
                metadata.Inherits = true;
                metadata.PropertyChangedCallback += OnSpacePropertyChanged;
    
                // 注册到依赖属性
                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;
                btn.Content = btn.SpaceOutText(btn.txt);
            }
    
            string SpaceOutText(string str)
            {
                if (str == null)
                    return null;
    
                StringBuilder build = new StringBuilder();
    
                foreach (char ch in str)
                    build.Append(ch + new string(' ', Space));
    
                return build.ToString();
            }
        }
    }
    

    上面自定义了一个依赖属性,fontsize属性也是以类似上面的方式定义。

    进一步深入参见:http://www.cnblogs.com/zhouyongh/archive/2009/09/10/1564099.html

             http://www.cnblogs.com/BillGan/archive/2011/05/26/2057859.html

             http://www.cnblogs.com/jimson/archive/2010/07/29/DependencyProperties.html

              http://www.cnblogs.com/HelloMyWorld/archive/2013/02/21/2920149.html

  • 相关阅读:
    SSL/TLS协议运行机制的概述(转)
    返回键捕获 应用程序退出的两种方式(转)
    openstack云5天资料
    数据挖掘十大经典算法
    中国大推力矢量发动机WS15 跨入 世界先进水平!
    BIEE在creating domain步骤停止的解决的方法
    suggest的使用方法
    二叉排序树
    vi 命令 使用方法
    Android Studio 初体验
  • 原文地址:https://www.cnblogs.com/pemp/p/3294931.html
Copyright © 2020-2023  润新知