0

我已经将扩展器放在页面上。在扩展器中有一个标签。页面加载后,扩展器尚未展开。此时,我使用 VisualTreeHelper 检查 Expander,我得到了这样的结构:

  Expander
    Border
      DockPanel
        ToggleButton
          Border
            Grid
              Ellipse
              Ellipse
              Path
              ContentPresenter
        ContentPresenter

最后一个 ContentPresenter 下没有标签。

但是,一旦展开器展开然后折叠,我使用 VisualTreeHelper 得到了不同的结构:

  Expander
    Border
      DockPanel
        ToggleButton
          Border
            Grid
              Ellipse
              Ellipse
              Path
              ContentPresenter
        ContentPresenter
          Label
            Border
              ContentPresenter

这一次,标签出现在 ContentPresenter 下。

似乎只要扩展器被扩展,VisualTreeHelper 就会知道扩展器中的内容。但是有没有办法让 VisualTreeHelper 知道 Expander 的内容而不展开它?

谢谢。

4

1 回答 1

4

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

我想你有某种递归循环来搜索你的元素。在调用获取其子项之前,请使用以下调用:

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

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

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

感谢陶亮在这里发布了这个解决方案。如果您在递归循环中遇到问题,也请阅读它。

于 2010-07-05T05:14:43.510 回答