0

我想详细了解如何添加到 VisualTree 和添加到 LogicalTree。我知道基础知识,并且我在互联网上阅读了几篇关于这两者的文章,但这些文章主要是关于它们之间的差异。我需要知道它们是如何工作的,或者更好地说明 AddVisualTree AddLogicalTree 方法是如何工作的,一旦我希望拥有从 FrameworkElement 派生的自定义控件并且具有子集的集合。

我是否需要在自定义控件中的每个子项/UIElement 上调用这两种方法?

我可以将 UIElement 添加到逻辑树而不是可视树吗?

添加到逻辑树是否自动包括添加到可视化树?如果是,那么我只需要调用一种方法而不是两种。

WPF 如何知道一旦添加到逻辑树中的子/UIElement 的父级是什么,因为逻辑父级可能是比子级更远的节点?

4

1 回答 1

1

是的,向逻辑树添加元素会影响控件的呈现方式(即,可视树)。是的,您可以向逻辑树添加一个无外观、无模板的元素,使其参与渲染为零,但您需要一个非常好的解释来说服高级开发人员这是一个好主意。

如果您正在编写 WPF 自定义控件(与用户控件相反),您首先应在控件模板中建立逻辑树;并且可视树将根据您的控件继承的内容以及您添加到控件模板的内容(例如装饰器或边框)是隐式的。

例如,您将爬上 Visual Tree 以到达 ListBox 的 VirtualizingStackPanel (VSP),但前提是需要调整 VSP 的自然行为以满足您的要求。另一方面,以编程方式顺着 Visual Tree 向下爬以到达 Content Presenter 应该是不必要的,因为它可以在 Xaml 中以声明方式解决。根据经验,如果您发现自己必须以编程方式多次爬升或下降可视树,那么这可能是您的控件需要从其他控件继承的信号,或者可能是您的设计被误解的信号.

总体而言,在构建自定义控件时,尽量以声明方式(即在 Xaml 中)在两棵树上执行操作,并避免以编程方式对它们进行爬升和下降。以编程方式添加子项也是如此(也可以使用模板以声明方式完成)。

于 2013-06-24T01:17:52.213 回答