我想知道如何添加到VisualTree和添加到LogicalTree工作的细节。我知道一些基础知识,我在网上读过一些关于这两种语言的文章,但这些文章大多是关于它们之间的差异。我需要的是知道它们是如何工作的,或者更好地说是AddVisualTree AddLogicalTree方法是如何工作的一旦我希望我的自定义控件从FrameworkElement派生并具有子级集合。
是否需要在自定义控件内的每个子元素/UIElement上同时调用这两个方法?
我可以将UIElement添加到逻辑树,但不能添加到可视化树吗?
添加到逻辑树是否自动包括添加到可视化树?如果是,那么我只需要调用一个方法,而不是两个。
添加到逻辑树中后,WPF如何知道子元素/UIElement的父元素是什么,因为逻辑父元素可能是比子元素更高级别的节点?
发布于 2013-06-24 01:17:52
是的,向逻辑树添加元素会影响控件的呈现方式(即可视化树)。是的,您可以向逻辑树添加一个无外观、无模板的元素,这样它在渲染中的参与就是零,但您需要一个真正好的解释来说服高级开发人员相信这是一个好主意。
如果要编写WPF自定义控件(而不是用户控件),首先应在控件模板中建立逻辑树;根据控件继承的内容以及随后添加到控件模板中的内容(如装饰器或边框),可视树将是隐式的。
例如,你可以爬一棵视觉树来达到ListBox的VirtualizingStackPanel ( VSP ),但这只有在需要调整VSP的自然行为满足你的需求的情况下才行。另一方面,没有必要以编程方式沿着Visual Tree向下爬到内容呈现器,因为它可以在Xaml中以声明方式进行寻址。根据经验,如果您发现自己必须以编程方式多次攀登或下降Visual Tree,那么这可能是一个信号,表明您的控件需要从不同的控件继承,也可能是一个信号,表明您的设计被误解了。
总而言之,当构建自定义控件时,尽量以声明的方式在两个树上做更多的事情(例如,在Xaml中),并避免以编程方式爬升和下降它们的需要。以编程方式添加子对象也是如此(这也可以通过模板以声明方式完成)。
https://stackoverflow.com/questions/17265589
复制