5

我有 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,因此我无法找到访问“网格”,并且当 UserControl 出现时,它的显示与我预期的不同。

我试图用谷歌搜索,但我发现的只是假设 VisualTree 不会为 ItemControl 构建,直到它显示在表单上。

有什么建议么?感谢和抱歉英语不好;)

4

1 回答 1

10

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

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

于 2012-05-26T19:22:39.850 回答