【问题标题】:wpf force to build visual treewpf 强制构建可视化树
【发布时间】:2012-05-26 18:57:12
【问题描述】:

我有 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 构建。

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

【问题讨论】:

    标签: c# wpf user-controls itemscontrol visual-tree


    【解决方案1】:

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

    尽管如此,这并不会一直应用模板。 在这种情况下,您首先必须在 ItemsControl 上调用ApplyTemplate(),然后调用var item_presenter = FindVisualChild&lt;ItemsPresenter&gt;(items_control),然后您必须调用item_presenter.ApplyTemplate(),现在您将强制网格进入 VisualTree。

    【讨论】:

    • 嗯,不,不工作,FindVisualChild() 仍然返回 null。仅帮助显示 UseControl,然后才更新行和列定义
    • 您在哪个阶段致电FindVisualChild?建设,加载,类似的东西?
    • 创建 UserControl 后,我设置了 DataContext,当引发 DataContextChanged 事件时,FindVisualChild 正在调用
    • 刚刚尝试在 Loaded 事件中更新网格并且成功了!感谢您的提示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    相关资源
    最近更新 更多