タイプ T の VisualTree 内のすべての子を取得するための次の実装があります。
IEnumerable<T> FindVisualChildrenRecurse<T>(DependencyObject root) where T : DependencyObject
{
if (root != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(root, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childOfChild in FindVisualChildrenRecurse<T>(child))
{
yield return childOfChild;
}
}
}
}
以下を使用してこのメソッドを呼び出します。
IEnumerable<TextBlock> textBlocks = FindVisualChildren<TextBlock>(
button.Content as DependencyObject);
ただし、ルート依存オブジェクトが T 型の場合、この実装は正常に機能しません。VisualTree 内のすべての TextBlocks を検索したいとします。
Content
StackPanel
TextBlock
Image
この場合、実装は TextBlock を正常に検出します。ただし、この他のレイアウトがある場合:
Content
TextBlock
実装にはルート オブジェクトが含まれていないため、TextBlock が見つかりません。メソッドを書き直してルート オブジェクトを含めるにはどうすればよいですか?