我做了细微的变化到@anatoliiG链接的代码以返回指定类型的所有子控件(而不是第一个):
private IEnumerable<childItem> FindVisualChildren<childItem>(DependencyObject obj)
where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
yield return (childItem)child;
foreach (var childOfChild in FindVisualChildren<childItem>(child))
yield return childOfChild;
}
}
有了这个功能,你可以做这样的事情:
var criteriaLabels =
from cl in FindVisualChildren<Label>(myListBox)
where cl.Content.ToString() == "criteria"
select cl;
foreach (var criteriaLabel in criteriaLabels)
{
// do stuff...
}
是否担心遍历视觉树将导致性能问题? – 2012-01-09 15:03:34
不一定,我只需要在应用程序启动时执行一次此操作。更多的是关心我的代码在我多次上下树之后不会变得多么优雅。 – 2012-01-09 15:06:08