自定义DependencyObject继承树
-
03-07-2019 - |
题
我很难找到有关 DependencyObject
和 DependencyProperty
使用的属性继承树(或继承上下文)的足够信息。
我想在典型的WPF页面之外使用 DependencyProperty
的值继承功能,这样对象A就是逻辑父对象B,因此分配给对象A上的属性的值将自动传播到对象B,除非它已在本地设置(有点像 FlowDirection
属性在WPF中工作)。
如果对象A和对象B来自 DependencyObject
,而不是 UIElement
的子代(换句话说,对象A是它是自己的 root ),那么如何建立逻辑树以便 DependencyProperty
理解B是A的孩子?
Hillberg Freezable Trick as以及 Josh Smith的诀窍并不是我所期待的对于。我不想要从现有元素树中检索属性...我想创建自己的非可视元素树...即控制继承上下文。
任何人都知道这些知识隐藏在哪里?
解决方案
经过大量研究并混淆了 DependencyObject
的源代码,这里是简短的回答:
InheritenceContext
(显示实例的逻辑父代的属性)(标记为内部的 DependencyObject
的90%的有用实现)因此保持隐藏来自WindowsBase.dll之外的所有代码
可以使用反射来设置 _contextParent
字段,以及调用这些隐藏的方法来设置 InheritenceContext
,但是在一天结束时不是一个干净的解决方案。
在搜索 DependencyObject
源代码之后,我得说我没有留下深刻的印象。 DependencyObject
可以而且应该是一个非常干净,无处不在的可重用类。
相反,它在结构和行为上与它的继承者绑定,甚至包含特定的常量,字段,方法和解决方法,以帮助Freezable与其他子类共存,这不仅偏离了良好的OO设计,而且在WPF框架之外,还使一个优秀的类完全无法使用。
其他提示
我假设您正在询问将值传播给不会自行覆盖值的子项。
据我所知, ContentControl
引入了具有子节点的WPF元素的概念。这在层次结构中比你想要的更进一步。所以,我假设如果您只是从 DependencyObject
派生出来,那么这种行为就不会显现出来。
具体而言,孩子需要知道询问其父母是否没有给定财产的价值。
有趣的问题。我也想知道完整的答案。