0

我目前有这行代码,我想在所有情况下都可以使用:

var visualWindowContent = (UIElement)window.Content;

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

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

4

2 回答 2

0

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

var contentPresenter = FindVisualChild<ContentPresenter>( window );
var visualWindowContent = (UIElement)VisualTreeHelper.GetChild( contentPresenter, 0 );
于 2011-11-18T21:19:04.793 回答
-1

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

object visualWindowContent = window.Content;

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

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

于 2011-11-18T20:53:19.973 回答