wpf force to build visual tree

2020-02-06 09:27发布

I have ItemsControl with Grid as ItemsPanelTemplate

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

I create some UserControl with this ItemControl inside in code-behind, and then i need to create RowDefinitions and ColumnDefinitons. I use this method to get "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;
    }

But if i call this method before showing UserControl it returns null, so I cant find access "grid" and when UserControl appears it displayed not as I expected.

I tried to google but all i found is assumption that VisualTree not building for ItemControl until it showed on form.

Any suggestions? Thanks and sorry for bad english ;)

1条回答
甜甜的少女心
2楼-- · 2020-02-06 10:11

You can make a call to ApplyTemplate this tells the element to apply the template and build the visual tree.

Although, this doesn't apply templates all the way down. In this case you would first have to call ApplyTemplate() on the ItemsControl, then var item_presenter = FindVisualChild<ItemsPresenter>(items_control), then you have to call item_presenter.ApplyTemplate() and now you will have forced the Grid into the VisualTree.

查看更多
登录 后发表回答