WPF 附加属性

      前言

        WPF 的体系结构原理之一是首选属性,而不是方法或事件。 属性具有声明性,可更方便地指定用途。 为了显示用户界面内容,属性还支持模型驱动或数据驱动的系统。通过创建更多的属性,从而更好地控制应用程序的行为。

        基于WPF是属性驱动的系统,项目中需要丰富强大的属性系统,在属性内容更改时进行通知。Microsoft .NET Framework 具有一个 INotifyPropertyChange 接口,对象通过该接口可以发布更改通知。

        WPF 还提供一个更丰富的属性系统,从 DependencyObject 类型派生。   DependencyObject 是一个“依赖”属性系统,因为它会跟踪属性表达式之间的依赖关系,并在依赖关系更改时自动重新验证属性值。 例如,如果具有一个可继承的属性(如 FontSize),当继承该值的元素的父级发生属性更改时,系统会自动更新。

        如果想进一步了解  DependencyObject 类的具体内容,可通过以下链接查看:

DependencyObject 类 (System.Windows) | Microsoft Learn

      DependencyProperty

        这里只做简单的介绍,具体详情请看上面链接。

        注册依赖属性的方法是调用DependencyProperty的静态Register方法,其提供了多个重载方法,但以下三个步骤是必须的.注册完毕是其是一个静态属性
        提供注册的名字(Name)
        注册属性类型(PropertyType)
        注册该依赖属性的所有者类型(OwnerType)

 注意:属性名字,属性类型,属性所有者类型一经注册将无法更改

public class DPCustomPeople
{
    public static readonly DependencyProperty AgeProperty =
        DependencyProperty.Register("Age", typeof(int), typeof(DPCustomPeople));

    public void DisplayAgeProperty()
    {
        Console.WriteLine("DPName:" + DPCustomPeople.AgeProperty.Name);
        Console.WriteLine("DPPropertyType:" + DPCustomPeople.AgeProperty.PropertyType);
        Console.WriteLine("DPOwnerType:" + DPCustomPeople.AgeProperty.OwnerType);
    }
}

class Program
{
    static void Main(string[] args)
    {
        DPCustomPeople people = new DPCustomPeople();
        people.DisplayAgeProperty();
    }
}

        DependencyObject

        DependencyProperty本身并不提供取值,赋值操作,而是由DependencyObject来负责,如果想要定义依赖属性,要求定义的类要继承自DependencyObject

       GetValue和SetValue方法

public int Age
{
    get { return (int)GetValue(AgeProperty); }
    set { SetValue(AgeProperty, value); }
}

        存储

        依赖属性存储在一个全局的属性系统中,采用一种高效的存储结构(如稀疏存储机制),这可以减少大量相同属性值在不同实例间的重复存储,提高内存利用率。

        所有的依赖属性由一个内部静态的哈希表(PropertyFromName)维护,一个对象定义的依赖属性键值不可以重复,相同键值的DP可以定义在其他对象中,为确保属性唯一性,使用依赖属性键值和对象的HashCode组成。

      附加属性

        附加属性(Attached Property)是一种特殊的依赖属性(Dependency Property),可以直接关联到类实例,“附加”到任何派生自DependencyObject的类实例上,即便那个类并没有在它的CLR(Common Language Runtime)类中定义这个属性。

        附加属性的作用是将属性与数据类型解耦,让数据类型的设计更灵活。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值