WPF强制构建可视树

5
我有一个ItemsControl,其中的ItemsPanelTemplate是Grid。
<ItemsControl ItemsSource="{Binding CellCollection}" Name="CellGrid">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid Name="grid" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

我在代码后台创建了一些包含ItemControl的UserControl,然后需要创建RowDefinitions和ColumnDefinitons。我使用以下方法获取"grid":

private TChildItem FindVisualChild<TChildItem>(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<TChildItem>(child);

            if (childOfChild != null)
                return childOfChild;
        }

        return null;
    }

但是,如果在显示UserControl之前调用此方法,则返回null,因此我无法访问“grid”,当UserControl出现时,它的显示方式并不像我预期的那样。
我尝试了谷歌,但我找到的所有内容都是假设VisualTree直到在表单上显示ItemControl后才会构建。
有什么建议吗? 谢谢,对语言表达不好感到抱歉 ;)
1个回答

10
您可以调用ApplyTemplate方法,这会告诉元素应用模板并构建可视化树。
尽管如此,这并不能一直应用到最底层。在这种情况下,您需要先在ItemsControl上调用ApplyTemplate(),接着var item_presenter = FindVisualChild<ItemsPresenter>(items_control),然后您需要调用item_presenter.ApplyTemplate(),现在您将强制网格进入VisualTree。

嗯,不行,FindVisualChild() 仍然返回 null。只有在显示 UseControl 并更新行和列定义后才会有帮助。 - user1308583
你在哪个阶段调用了 FindVisualChild?是在构造函数、Loaded事件或其他什么时候? - Steve
创建UserControl后,我设置了DataContext,并且当DataContextChanged事件被触发时,会调用FindVisualChild。 - user1308583
刚刚尝试在Loaded事件中更新网格,它起作用了!感谢这个提示。 - user1308583

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接