我很难找到有关 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 派生出来,那么这种行为就不会显现出来。

具体而言,孩子需要知道询问其父母是否没有给定财产的价值。

有趣的问题。我也想知道完整的答案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top