wpf заставляет строить визуальное дерево

У меня есть ItemsControl с сеткой как ItemsPanelTemplate

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

Я создаю некоторый UserControl с этим ItemControl внутри внутри кода, а затем мне нужно создать 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, он возвращает ноль, поэтому я не могу найти доступ & quot; grid & quot; и когда появляется UserControl, он отображается не так, как я ожидал.

Я пытался Google, но все, что я нашел, это предположение, что VisualTree не строит для ItemControl, пока он не показывается в форме.

Какие-либо предложения? Спасибо и извините за плохой английский;)

Ответы на вопрос(1)

Решение Вопроса

ApplyTemplate это говорит элементу применить шаблон и построить визуальное дерево.

Хотя это не применяет шаблоны до конца. В этом случае вам сначала нужно будет позвонитьApplyTemplate() на ItemsControl, затемvar item_presenter = FindVisualChild<ItemsPresenter>(items_control)тогда вам нужно позвонитьitem_presenter.ApplyTemplate() и теперь вы заставили Сетка в VisualTree.

 26 мая 2012 г., 23:17
Рад, что вы получили это работает :)
 26 мая 2012 г., 22:35
На каком этапе вы звонитеFindVisualChild? Строительство, загружено, что-то в этом роде?
 user130858326 мая 2012 г., 22:07
хм, нет, не работает, FindVisualChild () по-прежнему возвращает ноль. Помогает только показывать UseControl и только потом обновлять определения строк и столбцов
 user130858326 мая 2012 г., 23:03
Просто попытался обновить сетку в событии Loaded, и это сработало! Спасибо за чаевые
 user130858326 мая 2012 г., 22:58
После создания UserControl я устанавливаю DataContext, и FindVisualChild вызывает, когда происходит событие DataContextChanged.

Ваш ответ на вопрос