我正在努力找到有关DependencyObjectDependencyProperty使用的属性继承树(或继承上下文)的足够信息。

我想在典型的WPF页面之外使用DependencyProperty的值继承功能,这样对象A是逻辑父对象B,因此分配给对象A的属性的值将自动推广到对象B,除非它已经本地设置(有点像FlowDirection属性在WPF中起作用)。

如果从DependencyObject中删除了对象A和对象B,并且它们不是UIElement的子代(换句话说,对象A是它自己的根),那么如何建立逻辑树,以便DependencyProperty理解B是A的子代?

Hillberg Freezable TrickJosh 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/

10-12 20:58