如何使Expander的内容对VisualTreeHelper可见

时间:2010-07-04 15:26:02

标签: wpf expander

我把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的内容而不扩展它?

感谢。

1 个答案:

答案 0 :(得分:4)

有一种方法可以强制控件以编程方式加载其内容。

我想你会有某种递归循环来搜索你的元素。在打电话给孩子之前,请使用此电话:

if (element is FrameworkElement)
     (element as FrameworkElement).ApplyTemplate()

这将迫使它应用其模板并将控件加载到内存中。我想这是出于性能原因这样做的,因为在它们可见之前通常不需要控件。

这种方法也适用于TabControl以及任何其他可以隐藏内容的控件。我相信。

归功于陶亮,他在here上发布了此解决方案。如果您的递归循环出现问题,请阅读它。