【问题标题】:Customizing The DependencyObject Inheritance Tree自定义 DependencyObject 继承树
【发布时间】:2009-03-05 12:46:32
【问题描述】:

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

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

如果对象 A 和对象 B 派生自 DependencyObject,并且 不是 UIElement 的子级(换句话说,对象 A 是它自己的 ),那么你如何建立逻辑树,让DependencyProperty 明白B 是A 的孩子?

Hillberg Freezable TrickJosh Smith's bag of tricks 并不是我想要的。我不想想从现有元素树中检索属性...我想创建自己的非可视元素树...即控制继承上下文。

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

【问题讨论】:

  • 我很好奇你最终是如何解决你的问题的。您是否编写了自己的树/继承/DP机制?找到任何可以帮助您的图书馆?我正在尝试做类似的事情。

标签: .net wpf dependency-properties dependencyobject


【解决方案1】:

经过大量研究和混淆DependencyObject 的源代码,以下是简短答案:

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

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

在搜索了DependencyObject 源代码之后,我不得不说我没有留下深刻的印象。 DependencyObject 可以而且应该是一个非常干净、无处不在、可重用的类。 相反,它在结构上和行为上都绑定到它的继承者,甚至包含特定的常量、字段、方法和解决方法,以帮助 Freezable 与其他子类共存,这不仅与良好的 OO 设计相去甚远,而且还使原本出色的类在 WPF 框架之外完全无法使用。

【讨论】:

  • 为这个有趣问题的答案干杯。遗憾的是,这些类型的属性需要特定的基类,尽管我想不出更好的解决方案,因为语言/编译器支持(Freezable 也是如此)。
  • 你能分享你所寻求的解决方案吗?你做了你自己的“DependencyObject”实现?
【解决方案2】:

我假设您是在询问将值传播给不会覆盖值本身的子级。

据我所知,ContentControl 引入了具有子元素的 WPF 元素的概念。这在层次结构中比你想要的更深入。因此,我假设如果您只是从 DependencyObject 派生,则不会出现这种行为。

具体来说,孩子需要知道询问其父母是否没有给定属性的值。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2011-05-29
    • 2011-06-25
    • 2012-12-17
    • 2019-05-05
    相关资源
    最近更新 更多