65.9K
CodeProject 正在变化。 阅读更多。
Home

在另一个控件中查找子控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.80/5 (6投票s)

2009年5月20日

CPOL

1分钟阅读

viewsIcon

51442

downloadIcon

572

在另一个控件中查找子控件。

引言

我最近遇到一个场景,需要在一个控件内找到它的子控件。经过一番搜索,我找到了一种定位父控件的方法,但没有找到任何定位子控件的方法。

所以我决定自己编写一些代码(基于查找父控件的代码)。

代码

定位子控件实例的问题,已知类型的情况下,是我们需要遍历多个子控件才能找到该类型。记住,任何子控件都可能包含更多的子控件,以此类推。因此,递归显然就派上用场了。

另一个问题是,一组子控件可能包含多个我们正在查找的类型的实例。

例如,我正在下面的网格中查找一个文本块。那么我应该返回哪一个呢?

<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日:文章上传
© . All rights reserved.