• [转]WPF 依赖项属性


    from:http://blog.csdn.net/datoumimi/article/details/8033682

    ps:环境限制,发的东西一长就会被拦截,所以删了一部分 

    UI软件中经常会用到大量的控件,而每一个控件都是一个对象,每一个类都会有大量的属性,如果没创建一个对象就将所有的属性都创建出来,无非会占用大量的内存,wpf使用依赖项属性来提升了性能。

    查看任何一个控件的定义,以button为例,都会发现类内包含大量的依赖性属性定义,注意到其中DependencyProperty都是static readonly的,而每一个依赖项属性都会有一个去掉“Property”的CLR属性和他对应,而我们在xaml中访问的都是CLR属性。

            public static readonly DependencyProperty IsCancelProperty;
    
            public bool IsCancel { get; set; }
    

      

    如果我们自定义一个依赖项属性,方法是这样的

    public static readonly DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(ProvienceInfo));
    
            public string Name
            {
                set
                {
                    {
                        SetValue(NameProperty, value);
                    }
                }
                get
                {
                    return GetValue(NameProperty).ToString();
                }
            }

    注意到使用DependencyProperty的静态方法register将该属性注册到DependencyProperty上,DependencyProperty类的内部包含一个hashtable,所
    有的依赖项属性都存在这个哈希表中,哈希表的key为由DependencyProperty的name和ownertype组成的类,且使用name+ownertype作为的哈希值,这
    样就可以确保每个key是不重复的

    private class FromNameKey{ 
        privatestring _name; 
       private Type_ownerType; 
     
       // Methods
      public FromNameKey(string name, Type ownerType)
    
        {
           this._name = name;
    
           this._ownerType = ownerType;
    
           this._hashCode =
    
           this._name.GetHashCode() ^
    
           this._ownerType.GetHashCode();
       } 

    依赖项属性到底是怎么样节约内存的呢,由于我们创建控件对象时只会设置很少一部分属性,大部分属性都是使用默认值,默认值也就是所有的对象都是一样的,那就可以使用静态属性来表示了,上面提到的存储依赖项属性的hashtable就发挥作用了,clr将所有没有设置的属性存放在这个hashtable中,对于设置了值的属性,则会为这个对象创建一个数组,类型为EffectiveValueEntry,包含了一个属性的index,dependencyproperty提供了一个方法getglobalindex来获取此属性在hashtable中的位置,value当然就可以在此取出。

    internal struct EffectiveValueEntry  
    
    {  
    
        internal int PropertyIndex { get; set; }  
    
        internal object Value { get; set; }  
    
    } 

     这也是为什么依赖项属性注册为static readonly的却可以修改的原因。 

    依赖项属性还给我们提供了什么其他好处

    数据绑定:当我们绑定到数据源时,如果数据源的变更要想通知到UI,就需要实现inotifypropertychange接口,但如果将绑定源声明为依赖项属性,则可以直接通知更新UI。

    本地值:动画改变的属性只是改变临时变量,并未改变属性值

    附加属性和附加事件:

    附加属性是全局的依赖属性,依赖属性属于某个类,而附加属性可以用在其他对象上

  • 相关阅读:
    C# 单例模式
    [C# 线程处理系列]专题四:线程同步
    C#实现远程开机(局域网测试通过)
    C#实现类只实例化一次(被多个类访问调用)
    c#委托与事件、消息、WndProc用法(转)
    UML 类图常用表示方法.
    C# Socket 接受数据不全的处理
    执行数据库操作失败: 连接未关闭。 连接的当前状态为打开
    hdu 2018 母牛的故事 动态规划入门题
    Codeforces 1029B. Creating the Contest 动态规划O(nlogn)解法 及 单调队列O(n)解法
  • 原文地址:https://www.cnblogs.com/yzzw006/p/3492066.html
Copyright © 2020-2023  润新知