wpf force to build visual tree

青春壹個敷衍的年華 提交于 2019-12-17 20:38:15

问题


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:


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.



来源:https://stackoverflow.com/questions/10768945/wpf-force-to-build-visual-tree

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!