枚举`ContentPresenter`中的对象

时间:2015-03-11 15:37:16

标签: c# xaml windows-phone-8 wpf-controls

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,但不知道如何遍历那里的项目列表。

任何帮助?

谢谢! : - )

1 个答案:

答案 0 :(得分:1)

这取决于您在Content属性中找到的内容。它可以设置为任何东西(虽然并非所有对象都可以呈现)。

如果它返回类似string的实例,那么你就完成了。无需迭代。

如果它返回,例如对于那个问题,FrameworkElement或任何DependencyObject类型(尽管不一定都有孩子),然后您可以使用VisualTreeHelper类枚举该对象的对象图。由于它是树形结构,因此您必须以递归方式执行此操作。例如:

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,以清楚地说明您的具体情况。