C# WPF ContentControl:在子控件上迭代
我有一个WPF窗口,在这里我放置了一个ContentControl,稍后在我的代码中,我使用一个字符串,使用XamlReader.Load函数将其读取为Xaml,并将其放置在ContentControl中。这样做是为了创建一个动态用户界面。现在一切都完成了,但我想从这个控件捕获输入字段值。按一下按钮C# WPF ContentControl:在子控件上迭代,c#,wpf,dynamic-ui,C#,Wpf,Dynamic Ui,我有一个WPF窗口,在这里我放置了一个ContentControl,稍后在我的代码中,我使用一个字符串,使用XamlReader.Load函数将其读取为Xaml,并将其放置在ContentControl中。这样做是为了创建一个动态用户界面。现在一切都完成了,但我想从这个控件捕获输入字段值。按一下按钮 所以,我只想迭代ContentControl的子控件。我怎样才能做到这一点,似乎没有一种方法可以迭代它的子对象?任何想法。谢谢。在这里,您可以使用VisualTreeHelper:
所以,我只想迭代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而不是实际控件,在大多数情况下都很有用,除非您碰巧试图获取一个不受设计约束的密码箱的内容。