WPF之属性

  • 属性

  程序的本质就是“数据+算法”,在程序中,数据表现为各种各样的变量,算法表现为各种各样的函数。

  在面向对象的时代,类把散落在程序中的变量和函数进行归档并控制对它们的访问。被封装在类里的变量称为字段(Field),表示的是类或实例的状态;被封装在类里的函数称为方法,表示的是类或实例的功能。

  在类中,我们可以用Private和Public来表示字段的访问级别,如果全部使用public,直接将数据暴露给外界是很不安全的,如果使用private外界则无法访问,增加额外的函数又显得很分散,微软在.Net Frameword中,通过一堆Get/Set方法合并推出了属性的概念。

  • 依赖属性

  WPF中,微软将属性这个概念推进了一步,提出了“依赖属性”,即一种可以自己没有值,但能通过使用Binding从数据源获得值的属性。

  传统的.Net开发中,一个对象所占用的内存空间在调用new进行实例化的时候就已经确定了,而WPF允许对象在被创建的时候并不包含用于存储数据的空间(即字段所占用的空间)、只保留在需要用到数据时能够获得数据的能力,这种能力包括自行获得默认值、借用其他对象数据或实时分配空间。具备这种能力的对象就是依赖对象,而依赖对象获取数据的能力就是依靠依赖属性来实现的。

  在WPF系统中,依赖对象被DependencyObject类实现,依赖属性由DependencyProperty类实现。DependencyObject是WPF系统中相当底层的一个基类,所以WPF的所有UI控件都是依赖对象。DependencyProperty必须以DependencyObject为宿主,借助它的SetValue和GetValue进行写入和读取。以Student类为例,Name声明为依赖属性,代码如下:

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

  由此可见,自定义依赖属性,宿主必须是DependencyObject的派生类,变量的生命必须使用public static readonly修饰,实例并非使用new而是使用DependencyProperty.Register方法生成。

  Register是用宿主的CLR属性名称和宿主的类型的hash code做异或运算得到的值进行注册。被static和readonly修饰的对象实际是这个hash code值。

  DependencyProperty的建立过程:创建一个DependencyProperty实例并用它的CLR属性名和宿主类型名生成hash code,最后把hash code和DependencyProperty实例作为Key-Value对存入全局的名为PropertyFromName的HashTable中。

  • 附加属性

  附加属性是说一个属性本来不属于某个对象但由于某种需求而被后来附加上。也就是把对象放入一个特定环境后对象才具有的属性。

  附加属性的本质就是依赖属性,二者仅在注册和包装器上有一点区别。以人在学校为例,人本身没有年纪Grade属性,但在学校时就被赋予了Grade,创建类School,代码如下:

public class School:DependencyObject
    {
        public static string GetGrade(DependencyObject obj)
        {
            return (string)obj.GetValue(GradeProperty);
        }

        public static void SetGrade(DependencyObject obj, string value)
        {
            obj.SetValue(GradeProperty, value);
        }

        public static readonly DependencyProperty GradeProperty = DependencyProperty.RegisterAttached("Grade", typeof(string), typeof(School));

    }

  可见GradeProperty就是一个DependencyProperty,唯一不同的就是注册附加属性使用的是RegisterAttached,对属性的包装使用的是两个函数。

时间: 2024-12-11 11:36:29

WPF之属性的相关文章

WPF依赖属性详解

WPF依赖属性详解 WPF 依赖属性 英文译为 Dependency Properties,是WPF引入的一种新类型的属性,在WPF中有着极为广泛的应用,在WPF中对于WPF Dependency Properties 的使用贯穿样式的使用,数据绑定,动画等等,在刚刚接触Dependency Properties的时候可能觉得有些奇怪,但是,当你了解他要解决的问题的时候,你可能就不觉得奇怪了.Dependency Properties第一个要解决的问题就是控件的属性共享问题,由于大部分的WPF控

WPF - Style 属性 Setter

为了不让人迷惑,首先说明 Setters是一个属性 .Setter 是一个类 Setters 是Style类中的一个重要属性. Setters 包含着 Setter 和 EventSetter 类的集合 我们平时要用的 Setter 类, 用的它的什么?  三个属性:Property.Value.TargetName 怎么用 ?如下:把 这个窗体的按钮字体大小设置为36,可见:Style 类的TargetType 属性是用来指定被作用的对象类型的,这里是Button Setter 类的属性集合,

WPF依赖属性相关博客导航

1.一站式WPF--依赖属性(DependencyProperty)一(什么是依赖属性,依赖属性的由来) 2.一站式WPF--依赖属性(DependencyProperty)二(涉及依赖属性的使用) WPF依赖属性相关博客导航

[CodeSmith] WPF依赖属性脚本

<%-- Name: WPF 依赖属性 Author: Dxq Description: 生成WPF的依赖属性 --%> <%@ Template Language="C#" TargetLanguage="Text" %> <%@ Property Name="PropertyName" Default="PropertyName" Type="System.String"

WPF UpdateSourceTrigger属性

原文:WPF UpdateSourceTrigger属性 TextBox中的变化并不是立即传递到源,而是在TextBox失去焦点后,源才更新.这种表现由绑定中的UpdateSourceTrigger属性来控制.它的默认值是Default,源会根据你绑定的属性来更新.写这篇文章的时候,除了Text属性之外的所有属性,源会随属性的改变而立即更新.Text属性不一样,它只有在目标元素失焦后才更新. UpdateSourceTrigger的默认值是Default,其他值有PropertyChanged.

WPF 依赖属性概念

理解依赖属性 在 WPF 中变成相比较于 传统 Windows Forms 变成发生了较大的改变. 属性现在以一组服务的形式提供给开发人员. 这组服务就叫做属性系统. 由 WPF 属性系统所支持的属性成为依赖属性. 依赖属性的概念 WPF 在依赖属性中提供了标准属性无法提供的功能, 特性如下: 决定属性值: 依赖属性的属性值可以在运行时有其他元素或者是其他信息所决定, 决定的过程具有一个优先次序. 自动验证或变更通知: 依赖属性哟一个自定的回调方法, 当属性值变更时被执行, 这个回调能验证新的值

(WPF)属性值继承

属性值继承并不同于传统面向对象的类继承,而是指属性值自顶向下沿着元素树传递. 下面的代码在Window 元素上设置了Font属性.两个设置将会沿着逻辑树向下传递,并由子元素继承. 但是若子元素如设置了这样的属性,则不受其父元素设置的影响. <span style="font-size:14px;"> </span><span style="font-size:12px;"><Window xmlns = "http

WPF——依赖属性(Dependency Property)

1.什么是依赖属性 依赖属性是一种可以自己没有值,并且通过Binding从数据源获得值(依赖在别人身上)的属性,拥有依赖属性的对象被称为“依赖对象”. 依赖项属性通过调用 Register 方法(或 RegisterReadOnly)在 WPF 属性系统中注册,并通过 DependencyProperty 标识符标示属性. 依赖项属性只能由继承自 DependencyObject 类的类型使用,在WPF中大部分的类都可以支持依赖属性. 2.DependencyObject和DependencyP

WPF依赖属性1

属性是.net的核心部分,是每个.net程序员都必须熟悉的特性,但是在wpf中引入了依赖属性的概念,依赖属性和原来属性的定义完全不一样,wpf通过依赖属性改变了元素属性的定义方式,依赖属性为wpf的数据绑定.动画以及样式,都起到了关键的作用,所以理解依赖属性,对于理解wpf至关重要. C#的普通属性的定义,我们十分熟悉,他是一个成员变量,增加了get/set 方法实现的一种访问器,基本定义如下: class Example {     private string name;     publi

WPF 依赖属性

依赖属性,简单的说,在WPF控件应用过程中,界面上直接可以引用的属性 如:<Button Content="aaa"></Button> Content称为Button的依赖属性 当我们自定义控件时,如何添加依赖属性呢 1.添加属性 /// <summary> /// get or set the items /// </summary> public List<TitleListItemModel> TitleListIte