我目前有这行代码,我想在所有案例中使用
var visualWindowContent = (UIElement)window.Content;
当Window.Content是UIElement时,此方法将起作用。但是当它是一个非可视对象然后应用了DataTemplate呢?上面的代码行会抛出一个糟糕的强制转换异常。那么如何在这种情况下获取窗口的可视内容呢?
编辑:起初我说VisualTreeHelper.GetChild(window,0)返回null,但实际上它是非null。我的目的是通过将visualWindowContent传递给AdornerLayer.GetAdornerLayer来获取根装饰层。事实证明,当传递窗口的直接可视对象时失败(返回null),因为该节点在可视树中不够深,即AdornerDectorator的后代。
答案 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 );