LogicalTree VisualTree问题

时间:2013-06-23 21:39:00

标签: wpf xaml wpf-controls

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

如果您正在编写WPF自定义控件(而不是用户控件),则应在第一个实例中在控件模板中建立逻辑树;并且Visual Tree将基于您的控件继承的内容以及您添加到控件模板的内容(例如Adorner或Border)隐式。

例如,您可以爬上Visual Tree来到达ListBox的VirtualizingStackPanel(VSP),但这只有在需要调整VSP的自然行为符合您的要求时才会这样。另一方面,以编程方式爬下Visual Tree以访问Content Presenter应该是不必要的,因为它可以在Xaml中以声明方式解决。根据经验,如果您发现自己必须以编程方式攀爬或下降视觉树很多,那么它可能是您的控件需要从不同控件继承的信号,或者它可能是您的设计被误解的信号。

总的来说,在构建自定义控件时,尽可能以声明方式(即在Xaml中)对两个树执行操作,并避免以编程方式攀爬和降级它们。以编程方式添加子项也是如此(也可以使用模板以声明方式完成)。