在另一个控件中查找子控件
在另一个控件中查找子控件。
引言
我最近遇到一个场景,需要在一个控件内找到它的子控件。经过一番搜索,我找到了一种定位父控件的方法,但没有找到任何定位子控件的方法。
所以我决定自己编写一些代码(基于查找父控件的代码)。
代码
定位子控件实例的问题,已知类型的情况下,是我们需要遍历多个子控件才能找到该类型。记住,任何子控件都可能包含更多的子控件,以此类推。因此,递归显然就派上用场了。
另一个问题是,一组子控件可能包含多个我们正在查找的类型的实例。
例如,我正在下面的网格中查找一个文本块。那么我应该返回哪一个呢?
<Grid>
<TextBlock x:Name=”1”/>
<TextBlock x:Name=”2”/>
</Grid>
幸运的是,我的场景中没有多个实例。所以这就是我用来查找子控件类型的方法。
public static DependencyObject FindChild
(DependencyObject dependencyObject, Func<DependencyObject, bool> predicate)
{
if (searched != null) return searched;
DependencyObject child = null;
FrameworkElement frameworkElement = dependencyObject as FrameworkElement;
if (frameworkElement != null)
{
int intCount =
System.Windows.Media.VisualTreeHelper.GetChildrenCount(frameworkElement);
for (int i = 0; i < intCount; i++)
{
child = System.Windows.Media.VisualTreeHelper.GetChildrenCount
(frameworkElement) == 0 ? null :
System.Windows.Media.VisualTreeHelper.GetChild(frameworkElement, i);
if (predicate(child))
{
searched = child; break;
}
FindChild(child, predicate);
}
}
return searched;
}
这可能比较消耗资源,因为我们需要递归地在一个拥有许多子控件的控件中查找实例,而这些子控件又可能拥有许多子控件,以此类推。但它对我有用!
您可以下载我的示例源代码。它不是世界上最精美的代码,但它能很好地说明我想要实现的目标。
我们可以做的一件事是使用 FrameworkElement
对象的 FindName
方法来获取特定控件的实例,但这需要知道控件的名称(来自 XAML)。这并非总是可能的。
历史
- 2009年5月20日:文章上传