我把Expander放到了一个页面上。在扩展器中有一个Label。加载页面后,扩展程序尚未展开。此时,我使用VisualTreeHelper检查Expander,我得到了这样的结构:
Expander
Border
DockPanel
ToggleButton
Border
Grid
Ellipse
Ellipse
Path
ContentPresenter
ContentPresenter
最后一个ContentPresenter下没有Label。
然而,一旦展开扩展器然后折叠,我使用VisualTreeHelper得到了一个不同的结构:
Expander
Border
DockPanel
ToggleButton
Border
Grid
Ellipse
Ellipse
Path
ContentPresenter
ContentPresenter
Label
Border
ContentPresenter
这一次,Label出现在ContentPresenter下。
似乎只要扩展器已经扩展,VisualTreeHelper就会知道Expander中的内容。但有没有一种方法可以让VisualTreeHelper知道Expander的内容而不扩展它?
感谢。
答案 0 :(得分:4)
有一种方法可以强制控件以编程方式加载其内容。
我想你会有某种递归循环来搜索你的元素。在打电话给孩子之前,请使用此电话:
if (element is FrameworkElement)
(element as FrameworkElement).ApplyTemplate()
这将迫使它应用其模板并将控件加载到内存中。我想这是出于性能原因这样做的,因为在它们可见之前通常不需要控件。
这种方法也适用于TabControl
以及任何其他可以隐藏内容的控件。我相信。
归功于陶亮,他在here上发布了此解决方案。如果您的递归循环出现问题,请阅读它。