0

タイプ 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 が見つかりません。メソッドを書き直してルート オブジェクトを含めるにはどうすればよいですか?

4

1 に答える 1

1

ループする前にルートを返す必要がありました。この実装により、修正が行われます。

    IEnumerable<T> FindVisualChildren<T>(DependencyObject dependencyObject) where T : DependencyObject
    {
        if (dependencyObject == null)
            yield break;

        if (dependencyObject is T)
            yield return (T)dependencyObject;

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(dependencyObject, i);
            foreach (T childOfChild in FindVisualChildren<T>(child))
            {
                yield return childOfChild;
            }
        }
    }
于 2015-10-02T07:32:17.540 に答える