获取Window的视觉内容

时间:2011-11-18 20:50:19

标签: wpf window contentcontrol visual-tree

我目前有这行代码,我想在所有案例中使用

var visualWindowContent = (UIElement)window.Content;

当Window.Content是UIElement时,此方法将起作用。但是当它是一个非可视对象然后应用了DataTemplate呢?上面的代码行会抛出一个糟糕的强制转换异常。那么如何在这种情况下获取窗口的可视内容呢?

编辑:起初我说VisualTreeHelper.GetChild(window,0)返回null,但实际上它是非null。我的目的是通过将visualWindowContent传递给AdornerLayer.GetAdornerLayer来获取根装饰层。事实证明,当传递窗口的直接可视对象时失败(返回null),因为该节点在可视树中不够深,即AdornerDectorator的后代。

2 个答案:

答案 0 :(得分:0)

如果您想要内容本身,您可以使用该对象:

object visualWindowContent = window.Content;

这将适用于所有情况,因为内容将是UIElement或实际分配的对象。

如果您要查找通过数据模板创建的元素,请参阅MSDN上的Find DataTemplate-Generated Elements以获取选项。这是通过找到ContentPresenter并检查它的ContentTemplate来完成的。

答案 1 :(得分:0)

在@ReedCopsey链接的页面中使用FindVisualChild方法,这似乎有效:

var contentPresenter = FindVisualChild<ContentPresenter>( window );
var visualWindowContent = (UIElement)VisualTreeHelper.GetChild( contentPresenter, 0 );