为什么 WPF 中的依赖项属性必须是静态的

本文关键字:静态 属性 WPF 依赖 为什么 | 更新日期: 2023-09-27 18:35:49

为什么依赖属性必须是静态的?

我已经看到它已经在这里的某个帖子中被问过了,但我无法正确理解它。

如果有人也能用一个小片段帮助我理解,那就太好了。

为什么 WPF 中的依赖项属性必须是静态的

这里的神奇之处在于,DependencyProperty的声明static不是它的value(即内存存储)。使用 static 关键字添加的声明只是特定DependencyObject DependencyProperty的标识符(键)。由于 DependencyObject 的所有实例都可以使用相同的标识符/键来标识属性值,因此使其static是有意义的。

另一方面,当我们通过在实例上调用SetValue来设置DependancyProperty的值DependancyObject时,调用 SetValue 的每个DependancyObject实例都将存储其属性的本地值。这由 DependancyObject 类在内部处理,该类维护具有DependancyProperty标识符和本地值之间映射的某种Dictionary

DependencyProperty 必须是静态的

(类级别),因为当我们创建具有该属性的类的多个对象并希望引用该属性的默认值时,该值必须来自 DependencyProperty 的静态实例。因此,我们类的所有实例的默认值都是相同的,并且系统不会在该类的每个实例上为 DependencyProperty 保留内存。 这样它减少了内存占用。

现在下一个问题出现了,如果我们为类的对象显式设置 DependencyProperty 的值(通过代码、动画或样式)

在这种情况下,DependencyObject 进入了图片。任何具有 DependencyProperty 的类都必须派生自 DependencyObject 类(维护名为 EffectiveValue 的集合的 WPF 特定类)。当用户在类的对象上显式设置 DependencyProperty 的值(通过代码、动画或样式)时,该值将存储在驻留在 DependencyObject 类中的 EffectiveValues 集合中,并在那里保留内存。