自定义DependencyObject继承树

8

我在寻找关于DependencyObjectDependencyProperty使用的属性继承树(或继承上下文)的足够信息。

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

如果对象A和对象B都派生自DependencyObject,并且不是UIElement的子级(换句话说,对象A是它自己的),那么如何建立逻辑树,以便DependencyProperty理解B是A的子级?

Hillberg Freezable TrickJosh Smith的技巧包并不完全符合我的要求。我不想从现有元素树中检索属性... 我想创建自己的非可视元素树... 也就是说,控制继承上下文。

有人知道这些知识藏在哪里吗?


1
我很好奇你是如何解决问题的。你自己写了树/继承/动态规划机制吗?还是找到了一些库来帮助你?我正在尝试做类似的事情。 - Winston Fassett
2个回答

11

经过大量研究和深入源代码的探索,以下是简短的答案:

InheritenceContext(显示实例逻辑父级的属性)被标记为内部(像 DependencyObject 的 90% 有用实现一样),因此被隐藏在 WindowsBase.dll 之外的所有代码中。

虽然可以使用反射来设置 _contextParent 字段,以及调用这些隐藏方法来设置 InheritenceContext,但归根结底,这不是一个干净的解决方案。

在搜寻 DependencyObject 源代码后,我必须说我并不感到印象深刻。 DependencyObject 可以并且应该是一个非常干净,普遍,可重用的类。 相反,它在结构上和行为上与其继承者绑定,并且甚至包含特定的常量、字段、方法和工作区,以帮助 Freezable 与其他子类共存,这不仅偏离了良好的面向对象设计原则,而且使一个本来很棒的类无法在 WPF 框架之外使用。


1
感谢回答这个有趣的问题。不过很遗憾,这些属性需要特定的基类,除非有语言/编译器支持,否则我想不到更好的解决方案(Freezable也是如此)。 - Drew Noakes
你能分享一下你采用的解决方案吗?你自己实现了“DependencyObject”吗? - Nock

0

我假设你在问的是如何将值传递给没有覆盖自己的孩子。

据我所知,WPF元素拥有子元素的概念是由ContentControl引入的。这只比你想要探讨的层次更加深入。因此,我认为如果你仅从DependencyObject派生,这种行为不会显现。

具体而言,一个子元素需要知道如果它没有一个给定属性的值时要询问其父元素。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接