wpf强制构建可视化树

我有ItemsControl和Grid作为ItemsPanelTemplate

       

我在代码隐藏中使用此ItemControl创建了一些UserControl,然后我需要创建RowDefinitions和ColumnDefinitons。 我使用这种方法得到“网格”:

 private TChildItem FindVisualChild(DependencyObject obj) where TChildItem : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { var child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is TChildItem) return (TChildItem)child; var childOfChild = FindVisualChild(child); if (childOfChild != null) return childOfChild; } return null; } 

但是如果我在显示UserControl之前调用此方法它返回null,所以我无法找到访问“网格”,并且当UserControl出现时它显示不像我预期的那样。

我试图谷歌,但我发现的是假设VisualTree没有为ItemControl构建,直到它在表单上显示。

有什么建议? 谢谢,抱歉英文不好;)

您可以调用ApplyTemplate,它告诉元素应用模板并构建可视化树。

虽然,这不会一直应用模板。 在这种情况下,您首先必须在ItemsControl上调用ApplyTemplate() ,然后var item_presenter = FindVisualChild(items_control) ,然后您必须调用item_presenter.ApplyTemplate() ,现在您将强制Grid进入VisualTree。