0

同じアプリケーションから論理ツリーと視覚ツリーを探索していますが、レベルをさらに深くすることはできません。

私のコードでは、汎用エクスプローラーを使用しています。

private static void ProcessGenericTree(object current, List<FrameworkElement> leaves, Type treeType) 
        {
            if (current is FrameworkElement)
            {
                if (!leaves.Contains(current as FrameworkElement))
                    leaves.Add(current as FrameworkElement);
            }

            DependencyObject dependencyObject = current as DependencyObject;

            if (dependencyObject != null)
            {
                if (treeType.Equals(typeof(VisualTreeHelper)))
                {
                    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i++)
                    {
                        ProcessVisualTree(VisualTreeHelper.GetChild(dependencyObject, i), leaves);
                    }
                }
                else
                {
                    foreach (object child in LogicalTreeHelper.GetChildren(dependencyObject))
                    {
                        ProcessLogicalTree(child, leaves);
                    }
                }
            }
        }

ProcessLogicalTree単純に反復します (再呼び出しProcessVisualTreeの前に何かを行います)。ProcessGenericTree

TextBlock結果は完全に見えますが、 をヘッダーに取得しようとするとGridViewColumn、 の論理リーフ リストにもビジュアル リーフ リストにもアイテムが存在しないように見えますFrameworkElement

Visual ElementからLogical Elementへの変換のようです。実際、時計を追加すると、これは私のVisual ChildrenTextBlockに表示されます (論理として取得され、選択されていません) が、私のコードはそれを取得できません。GridViewTab Item

私の呼び出しは非常に簡単です:

         ProcessVisualTree(root, _visualElements);
         ProcessLogicalTree(root, _logicalElements);

root は MainWindow です。

では、ツリーの最も深いレベルを探索するにはどうすればよいでしょうか? たぶん、取得したFrameworkElementリストを繰り返しますか? 私のProcessGenericコードはすでにそれを行っていると思います。

更新: WPF ビジュアライザーは、この種の構造を示しています。

ListView > ScrollViewer > Grid > DockPanel > Grid > ScrollContentPresenter > GridViewHeaderRowPresenter > GridViewColumnHeader > HeaderBorder

GridViewColumnHeaderレベルには myTextBlockが含まれていますが、ビジュアル ツリーには含まれていません。

更新 2 : 要素が表示されているメイン ウィンドウから再帰を使用すると、次のコードで指定された名前のオブジェクトを見つけることができません。

public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            {
                return (T)child;
            }

            T childItem = FindVisualChild<T>(child);
            if (childItem != null) return childItem;
        }
    }
    return null;
}

VisualTreeHelperHeader プロパティ内の要素を取得できないと確信していますが、 WPF インスペクターは正しく動作します。

ツリーをトラバースするために別のアプローチを使用しているのだろうか(おそらく検査PropertiesHeader)。提案?

4

0 に答える 0