【问题标题】:WPF ContentControl: Iterating over child controlWPF ContentControl:迭代子控件
【发布时间】:2013-09-12 09:44:18
【问题描述】:

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

所以,我要做的就是迭代 ContentControl 的子控件。我该怎么做,似乎没有办法迭代它的孩子?任何想法。谢谢。

【问题讨论】:

    标签: c# wpf dynamic-ui


    【解决方案1】:

    在这里,你可以使用 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;
                }
            }
    

    【讨论】:

    • 它返回给我一个 ContentPresenter 对象 [只有一个,因为我没有声明或使用任何 ControlPresenter,我的“内容”中只有一个带有几个按钮和输入字段的 StackPanel
    • 是的.. 你必须迭代你第一次得到的 contentpresenter。所有控件都在 contentpresenter 中。
    • 所以它是一种双循环,对...很好,但是你能建议我是否总是得到这样的双循环吗?
    • 尝试使用 LogicalTreeHelper 而不是 VisualTreeHelper。这应该会给你想要的孩子。
    • LogicalTreeHelper 也提供了一个对象,我应该再次迭代以获取我的堆栈面板,因此我必须迭代两次似乎是解决方案。不过感谢您的帮助。
    【解决方案2】:

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

    按钮 -> 边框 -> ContentPresenter -> 文本块

    逻辑树列表只是控件本身(正如您在 xaml 中声明的那样)。 欲了解更多详情,请访问此网站:http://wpftutorial.net/LogicalAndVisualTree.html

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

    【讨论】:

    • 这会返回 ContentPresenter 的 DataContext 而不是实际的控件,这在大多数情况下很有用,除非您碰巧尝试获取未按设计绑定的 PasswordBox 的内容。
    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多