Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么WPF中的依赖属性必须是静态的_C#_.net_Wpf_C# 4.0_Dependency Properties - Fatal编程技术网

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

C# 为什么WPF中的依赖属性必须是静态的,c#,.net,wpf,c#-4.0,dependency-properties,C#,.net,Wpf,C# 4.0,Dependency Properties,为什么依赖项属性必须是静态的 我看到这里的一些帖子已经问过了,但我无法正确理解 如果有人也能用一个小片段帮助我理解,那就太好了。这里的神奇之处在于,dependencProperty的声明是静态的而不是它的值(即内存存储)。使用static关键字添加的声明只是特定DependencyObject的DependencyProperty的标识符(键)。由于DependencyObject的所有实例都可以使用相同的标识符/键来标识属性值,因此将其设置为静态是有意义的 另一方面,当我们通过调用Depen

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

我看到这里的一些帖子已经问过了,但我无法正确理解


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

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


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

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

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


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

上述问题答案中可能重复的解释非常重要,请阅读基础知识,然后我们可以讨论这些约束是否有效。@M.Babcock:这就是我在描述中所说的,我已经看到了一些解释,但这些解释并不全面。我在这里写问题之前已经看到了你给出的链接,我也看到了,如果有人能帮助我更好更全面地理解它,我会在等待的同时仔细阅读。非常感谢你,尼特,这对我帮助很大。我也在寻找一些好的代码片段,以便更好地理解它。我不理解这句话——“依赖对象的所有实例都将共享相同的标识符”。如果您能解释一下,那就太好了,我是编程新手:(您可以将其作为字典的keyvaluepair的键,DependencyObject必须存储dependency属性的值。由于每个实例可以具有不同的属性值,但要标识该值,我们不需要不同的键,因为每个实例的值将对应于同一个键。因此非常感谢Nit,这有助于我更好地理解它。干杯,这很有帮助。如果你想详细阅读依赖属性的值解析。这里有一个很好的可视化表示,这是一个很好的答案;但是,DependencyObject不是一个特定于WPF的类——它在Silverlight和WinRT中也可用。