通过“ContentPresenter”中的对象枚举

Enumerating through objects in `ContentPresenter`

Windows Phone 8.1

我有一个带有 ContentPresenter 的自定义控件。

当此控件用于 XAML 页面时,可以在那里添加任何类型的 FrameworkElement

我想枚举 ContentPresenter 中的所有项目,并根据我在那里找到的内容采取行动。

这是我的方法:

protected override void OnApplyTemplate()
{
        base.OnApplyTemplate();

        validationContentPresenter = this.GetTemplateChild("ValidationContentPresenter") as ContentPresenter;
        //it does not compile since `Content` does not seem to allow it
        foreach (FrameworkElement o in validationContentPresenter.Content)
        {

        }
}

如您所见,我找到了 ContentPresenter 但不知道如何遍历那里的项目列表。

有什么帮助吗?

谢谢! :-)

这将取决于您在 Content 属性 中找到的内容。它可以从字面上设置为任何内容(尽管并非所有 object 都可以呈现)。

如果它 returns 类似于 string 的实例,那么您就完成了。没有什么可迭代的。

如果 returns 例如FrameworkElement,或与此相关的任何 DependencyObject 类型(尽管并非所有类型都必须具有 children),然后您可以使用 object 枚举 object 图表VisualTreeHelper class。由于它是树结构,因此您必须递归地执行此操作。例如:

IEnumerable<DependencyObject> GetAllVisualChildren(DependencyObject o)
{
    yield return o;

    int childCount = VisualTreeHelper.GetChildrenCount(o);

    for (int i = 0; i < childCount; i++)
    {
        foreach (DependencyObject child in
            GetAllVisualChildren(VisualTreeHelper.GetChild(i)))
        {
            yield return child;
        }
    }
}

你可以这样使用它:

DependencyObject dobj = validationContentPresenter.Content as DependencyObject;

if (dobj != null)
{
    foreach (FrameworkElement o in
        GetAllVisualChildren(dobj).OfType<FrameworkElement>())
    {

    }
}

不幸的是,关于您希望分配给 Content 属性 的具体内容,您的问题有点含糊,所以我无法确定最适合您的方法是什么。但希望上面的内容能给你一些想法。如果它没有完全回答您的问题,请编辑您的问题以提供更具体的详细信息,包括 a good, minimal, complete code example 清楚地说明您的具体情况。