我正在努力找到有关DependencyObject
和DependencyProperty
使用的属性继承树(或继承上下文)的足够信息。
我想在典型的WPF页面之外使用DependencyProperty
的值继承功能,这样对象A是逻辑父对象B,因此分配给对象A的属性的值将自动推广到对象B,除非它已经本地设置(有点像FlowDirection
属性在WPF中起作用)。
如果从DependencyObject
中删除了对象A和对象B,并且它们不是UIElement
的子代(换句话说,对象A是它自己的根),那么如何建立逻辑树,以便DependencyProperty
理解B是A的子代?
Hillberg Freezable Trick和Josh Smith's bag of tricks都不是我想要的。我不想从现有的元素树中检索属性...我想创建自己的非可视元素树...即可以控制继承上下文。
有人知道这种知识隐藏在哪里吗?
最佳答案
经过大量研究并混淆了DependencyObject
的源代码,这是简短的答案:InheritenceContext
(显示实例的逻辑父级的属性)被标记为内部,(例如DependencyObject
的有用实现的90%)标记为内部,因此对WindowsBase.dll之外的所有代码都隐藏了
可以使用反射来设置_contextParent
字段,也可以调用此隐藏方法来设置InheritenceContext
,但最终这不是一个干净的解决方案。
在搜索DependencyObject
源代码之后,我不得不说我没有留下深刻的印象。 DependencyObject
可以并且应该是一个非常干净,无处不在,可重用的类。
相反,它在结构上和行为上都绑定(bind)到它的继承者,甚至包含特定的常量,字段,方法和变通方法,以帮助Freezable与其余子类共存,这不仅偏离了良好的OO设计,而且也使得在WPF框架之外完全无法使用的其他一流类。
关于.net - 自定义DependencyObject继承树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/614624/