Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF ContentControl:在子控件上迭代_C#_Wpf_Dynamic Ui - Fatal编程技术网

C# WPF ContentControl:在子控件上迭代

C# WPF ContentControl:在子控件上迭代,c#,wpf,dynamic-ui,C#,Wpf,Dynamic Ui,我有一个WPF窗口,在这里我放置了一个ContentControl,稍后在我的代码中,我使用一个字符串,使用XamlReader.Load函数将其读取为Xaml,并将其放置在ContentControl中。这样做是为了创建一个动态用户界面。现在一切都完成了,但我想从这个控件捕获输入字段值。按一下按钮 所以,我只想迭代ContentControl的子控件。我怎样才能做到这一点,似乎没有一种方法可以迭代它的子对象?任何想法。谢谢。在这里,您可以使用VisualTreeHelper:

我有一个WPF窗口,在这里我放置了一个ContentControl,稍后在我的代码中,我使用一个字符串,使用XamlReader.Load函数将其读取为Xaml,并将其放置在ContentControl中。这样做是为了创建一个动态用户界面。现在一切都完成了,但我想从这个控件捕获输入字段值。按一下按钮


所以,我只想迭代ContentControl的子控件。我怎样才能做到这一点,似乎没有一种方法可以迭代它的子对象?任何想法。谢谢。

在这里,您可以使用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中声明的控件本身。 有关详细信息,请访问此网站:


因此,要获取所需的子对象,请选择LogicalTreeHelper.GetChildrencontentControl;应该可以工作。

它会向我返回一个ContentPresenter对象[还有一个,因为我没有声明或使用任何ControlPresenter,所以我的Contentyes中只有StackPanel和几个按钮和输入字段。你必须迭代你第一次得到的contentpresenter。所有的控件都在contentpresenter中。所以这是一种双循环,对……这很好,但是你能建议我是否总是使用ge吗t像这样进行双循环?尝试使用LogicalTreeHelper而不是VisualTreeHelper。这将为您提供想要获取的子对象。LogicalTreeHelper也提供了一个我应该再次迭代以获取stackpanel的对象,因此我必须迭代两次才是解决方案。不过,感谢您的帮助。这将返回ContentPrese的DataContextnter而不是实际控件,在大多数情况下都很有用,除非您碰巧试图获取一个不受设计约束的密码箱的内容。