wpf force to build visual tree
Asked Answered
M

1

5

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 ;)

Mediacy answered 26/5, 2012 at 18:57 Comment(0)
K
10

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.

Kareykari answered 26/5, 2012 at 19:22 Comment(4)
hm, nope, not working, FindVisualChild() still returns null. Helps only showing UseControl and only then updating Row and Column DefinitionsMediacy
At which stage are you calling FindVisualChild? Construction, Loaded, something like that?Kareykari
After creation UserControl I set DataContext, and FindVisualChild is calling when DataContextChanged event is raisedMediacy
Just tried to update grid in Loaded event and it worked! Thanks for the tipMediacy

© 2022 - 2024 — McMap. All rights reserved.