wpf强制构建可视化树

时间:2012-05-26 18:57:12

标签: c# wpf user-controls itemscontrol visual-tree

我将ItemsControl与Grid一起作为ItemsPanelTemplate

<ItemsControl ItemsSource="{Binding CellCollection}" Name="CellGrid">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid Name="grid" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

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

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 个答案:

答案 0 :(得分:9)

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

尽管如此,这并不是一直应用模板。 在这种情况下,您首先必须在ItemsControl上调用ApplyTemplate(),然后调用var item_presenter = FindVisualChild<ItemsPresenter>(items_control),然后您必须调用item_presenter.ApplyTemplate(),现在您将强制Grid进入VisualTree。