前言
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)类中定义这个属性。
附加属性的作用是将属性与数据类型解耦,让数据类型的设计更灵活。
2113

被折叠的 条评论
为什么被折叠?



