2011-11-18 94 views
0

我现在有这行代码,我想在所有案件工作:获取窗口的视觉内容

var visualWindowContent = (UIElement)window.Content; 

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

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

回答

0

使用由@ReedCopsey链接的页面FindVisualChild方法,这似乎工作:

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

如果你想要的内容本身,你可以只使用对象:

object visualWindowContent = window.Content; 

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

如果你试图寻找通过数据模板创建的内容,请参阅MSDN上Find DataTemplate-Generated Elements的选项。这是通过找到ContentPresenter并检查它的ContentTemplate完成的。

+0

我想在所有情况下 – HappyNomad

+0

@HappyNomad编辑视觉到包括... –

+0

请在填写问题标记: var cp = FindVisualChild (window); var visualWindowContent =(UIElement)cp.ContentTemplate.FindName(“???”,cp); – HappyNomad