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