VisualTreeHelper.GetChildrenCount 返回 0?

2023-12-20

我在用着VisualTreeHelper.GetChildrenCount()查找子控件,但它总是返回0。

这是我的代码

<ScrollViewer x:Name="scrollViewerChannelsRecordTimeData">
    <StackPanel x:Name="channelsRecordTimeData">
        <ItemsControl x:Name="channelRecordTimeItems" ItemsSource="{Binding}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid x:Name="hoursLines">
                        //Some Controls here                            
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel>
</ScrollViewer>   

C# code:

channelRecordTimeItems.ItemContainerGenerator.StatusChanged += ChannelRecordTimeItemsStatusChangedEventHandler;
private void ChannelRecordTimeItemsStatusChangedEventHandler(Object sender, EventArgs e)
{
    if (channelRecordTimeItems.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
    {
        if (channelRecordTimeItems.HasItems)
        {
            DependencyObject dependencyObject = null;
            Grid gridHighlightRecordData = null;
            for (int i = 0; i < channelRecordTimeItems.Items.Count; i++)
            {
                dependencyObject = channelRecordTimeItems.ItemContainerGenerator.ContainerFromIndex(i); //dependencyObject != null
                 if (dependencyObject != null)
                 {
                    Grid hoursLines = FindElement.FindChild<Grid>(dependencyObject, "hoursLines"); //hoursLines = null
                 }
            }
        }
    }
}

public static T FindChild<T>(DependencyObject parent, string childName)
   where T : DependencyObject
{
    // Confirm parent and childName are valid. 
    if (parent == null) return null;

    T foundChild = null;

    int childrenCount = VisualTreeHelper.GetChildrenCount(parent); //Return 0 here
    for (int i = 0; i < childrenCount; i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);
        // If the child is not of the request child type child
        T childType = child as T;
        if (childType == null)
        {
            // recursively drill down the tree
            foundChild = FindChild<T>(child, childName);

            // If the child is found, break so we do not overwrite the found child. 
            if (foundChild != null) break;
        }
        else if (!string.IsNullOrEmpty(childName))
        {
            var frameworkElement = child as FrameworkElement;
            // If the child's name is set for search
            if (frameworkElement != null && frameworkElement.Name == childName)
            {
                // if the child's name is of the request name
                foundChild = (T)child;
                break;
            }
        }
        else
        {
            // child element found.
            foundChild = (T)child;
            break;
        }
    }

    return foundChild;
}

VisualTreeHelper.GetChildrenCount()总是返回0,

这里是构建项目的代码

List<ChannelRecordTimeItemData> listChannelRecordTimeItemData = new List<ChannelRecordTimeItemData>();
for(int i = 0; i < 5; i++)
{
    ChannelRecordTimeItemData item = new ChannelRecordTimeItemData();
    listChannelRecordTimeItemData.Add(ChannelRecordTimeItemData);
}
channelRecordTimeItems.ItemsSource = listChannelRecordTimeItemData;
channelRecordTimeItems.Items.Refresh();

我在论坛和互联网上搜索过,但无法解决,有人可以帮助我吗?

非常感谢!

T&T


问题是当ItemContainerGenerator发出信号ContainersGenerated状态,容器(aContentPresenter) 已创建,但尚未加载。特别是数据模板尚未应用于ContentPresenter,因此可视化树中没有任何内容。

您可以通过添加一个来解决这个问题Loaded循环生成的容器时的事件处理程序。

private void ItemContainerGeneratorStatusChanged(object sender, EventArgs e)
{
    if (itemsControl.ItemContainerGenerator.Status
        == GeneratorStatus.ContainersGenerated)
    {
        var containers = itemsControl.Items.Cast<object>().Select(
            item => (FrameworkElement)itemsControl
                .ItemContainerGenerator.ContainerFromItem(item));

        foreach (var container in containers)
        {
            container.Loaded += ItemContainerLoaded;
        }
    }
}

private void ItemContainerLoaded(object sender, RoutedEventArgs e)
{
    var element = (FrameworkElement)sender;
    element.Loaded -= ItemContainerLoaded;

    var grid = VisualTreeHelper.GetChild(element, 0) as Grid;
    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VisualTreeHelper.GetChildrenCount 返回 0? 的相关文章

随机推荐

  • 将点添加到r中的3d图中

    我是 R 中 3D 绘图的初学者 我需要帮助 我尝试绘制一些简单的抛物面 library rgl x lt seq 1 1 0 2 y lt x f lt function x y x 2 y 2 z lt outer x y f pers
  • 如何在 Typescript 中使用 Ziggy 包

    所以我想创建一个使用 axios 检索数据的打字稿类 但我无法找到使用的方法route ziggy 在我的 Typescript 类中提供的函数 因为它不是 npm 包 我对 Node js 还是很陌生 任何帮助是极大的赞赏 import
  • 在 Python 中将列表项与大文件中的行进行匹配的最有效方法是什么?

    我有一个大文件 5Gb 名为my file 我有一个名为my list 读取文件中每一行的最有效方法是什么 如果来自my list匹配以下行中的项目my file 创建一个名为的新列表matches包含以下行中的项目my file以及来自的
  • docker 与 openshift 相比如何?

    Docker http www docker io and 开放式班次 https www openshift com 都是实现 PaaS 服务的框架 它们在架构和功能方面如何比较 主要区别在于 Docker 作为一个项目仅关注运行时容器
  • Android 获取屏幕高度

    Android 中如何获取屏幕的可用高度 我需要减去状态栏 菜单栏或屏幕上可能出现的任何其他装饰的高度 并且我需要它适用于所有设备 另外 我需要在 onCreate 函数中知道这一点 我知道这个问题之前已经被问过 但我已经尝试过他们的解决方
  • 值超出指定精度 0,小数位数为 0

    我正在尝试为 Apache Drill v1 15 创建自定义函数 当使用 Decimal 作为output数据类型 即使是最简单的例子也会失败 当使用其他数据类型 int float 时 它工作得很好 有没有简单的方法 如何使小数作为 U
  • HBase:get(...) 与扫描和内存表

    我正在 HBase 上执行 MR 减速器中的业务逻辑大量访问两个表 例如 T1 40k 行 和 T2 90k 行 目前 我正在执行以下步骤 1 在reducer类的构造函数中 执行如下操作 HBaseCRUD hbaseCRUD new H
  • PHAsset 获取原始文件名

    我想知道有没有办法使用PHAsset获取原始文件名 我使用以下代码来提取文件信息 PHImageManager defaultManager requestImageDataForAsset asset options requestOpt
  • 嵌入 CPython:如何构造 Python 可调用对象来包装 C 回调指针?

    假设我将 CPython 解释器嵌入到一个用 C 编写的较大程序中 该程序的 C 组件偶尔需要调用用 Python 编写的函数 并将回调函数作为参数提供给它们 使用 CPython扩展和嵌入 https docs python org 3
  • 如何连接SQLite3数据库服务器?

    我知道 SQLite3 不在客户端 服务器数据库应用程序模型下运行 所以我想知道如何使用 SQLite3 实际连接到 正在运行 的数据库服务器 这意味着如果我有一个在带有 SQLite3 的 Linux 上运行的数据库服务器 客户端将如何连
  • android从zip文件中解压缩文件夹并从该文件夹中读取内容

    在我的一个应用程序中 我需要提取一个 zip 文件 其中包含文件夹 并且该文件夹包含图像 这意味着 abc zip gt adb folder gt abc png 我想提取图像文件 我用下面的方法 private boolean extr
  • .NET Core 2.0 SDK 中 lib 和 ref 文件夹中的 .DLL 有什么区别?

    NET Core 2 0 SDK 中的每个 DLL 都有两个副本 它们具有不同的内容和文件大小 例如 c Program Files dotnet sdk 2 0 0 Microsoft Microsoft NET Build Extens
  • sailsjs 使用 mongodb 而不使用 ORM

    我想将 mongodb 与 sails 一起使用 但没有任何 ORM 下面是我连接 mongodb 的服务 服务 DbService js const MongoClient require mongodb MongoClient modu
  • 如何指定可以在 C# ColorDialog 中选取哪些颜色?

    在 Visual C NET 中 我希望能够创建一个颜色对话框 并让用户只能选择几种颜色 特别是可用于命令提示符 批处理文件的颜色 这是怎么做到的 如何限制用户可以选择的颜色 另外 有没有办法 停靠 颜色对话框 以便它不会以新表单打开 而是
  • 内部/外部类 obj.new

    这是在类外部调用成员内部类的示例 Program of memeber inner class that is invoked outside a class class Outer private int data 10 class In
  • 使用 C# .NET 调用 Paypal 自适应支付 API?最好使用 Web 服务

    好吧 我现在可能完全偏离了轨道 但这里是 我们的 网上商店 提供两种功能 购买特定产品并将其卖回给我们 后端处理用户是否可以出售 我决定为此使用 Paypal 的自适应支付 因为这似乎是进行此类交易的方式 我从来没有建立过任何类型的商店 所
  • 如何在嵌入式 Jetty 8 中部署 WAR?

    使用以下代码 如何部署位于类路径上的 WAR 应用程序 private Server s BeforeClass public static void setUp throws Exception Start http server Ran
  • Jenkins 工作区中的 @tmp 文件夹是什么以及如何清理它们

    我有一个 Jenkins 管道 用于 Docker 容器中的 PHP 项目 这是我的 Jenkins 文件 pipeline agent any stages stage Build agent any steps sh docker co
  • 如何在android中将Unicode字符串转换为文本

    我从服务器收到了如下所示的 json AuthenticationMessage u0986 u09aa u09a8 u09bf u09ad u09c1 u09b2 u09aa u09be u09b8 u0993 u09df u09be u
  • VisualTreeHelper.GetChildrenCount 返回 0?

    我在用着VisualTreeHelper GetChildrenCount 查找子控件 但它总是返回0 这是我的代码