WPF 内容控件:循环访问子控件

本文关键字:控件 访问 循环 WPF | 更新日期: 2023-09-27 18:31:12

我有一个WPF窗口,我在其中放置了一个ContentControl,稍后在我的代码中,我使用XamlReader.Load 函数将字符串读取为Xaml,并将其放入ContentControl中。这样做是为了制作一个 Dyanmic UI。现在一切都完成了,但我想从这个控件中捕获输入字段值。在按钮单击时。

所以,我想做的只是迭代 ContentControl 的子控件。我怎么能做到这一点,似乎没有办法迭代它的孩子?任何想法。谢谢。

WPF 内容控件:循环访问子控件

在这里,您可以使用 VisualTreeHelper:

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(contentControl); i++)
        {
            var child = VisualTreeHelper.GetChild(contentControl, i);
            if(child is ContentPresenter)
            {
                var contentPresenter = child as ContentPresenter;
                for (int j = 0; j < VisualTreeHelper.GetChildrenCount(contentPresenter); j++)
                {
                    var innerChild = VisualTreeHelper.GetChild(contentPresenter, j);
                }
                break;
            }
        }

逻辑树和可视化树之间的区别在于,可视化树列出了用于显示控件的所有元素。 例如,按钮的可视化树看起来像

按钮 ->边框 -> 内容演示者 -> 文本块

逻辑树只列出控件本身(如您在 xaml 中声明的那样)。有关更多详细信息,请访问此网站:http://wpftutorial.net/LogicalAndVisualTree.html

所以为了得到你想要的孩子,LogicalTreeHelper.GetChildren(contentControl);应该工作。