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
,但不知道如何遍历那里的项目列表。
任何帮助?
谢谢! : - )
答案 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,以清楚地说明您的具体情况。