同じアプリケーションから論理ツリーと視覚ツリーを探索していますが、レベルをさらに深くすることはできません。
私のコードでは、汎用エクスプローラーを使用しています。
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
に表示されます (論理として取得され、選択されていません) が、私のコードはそれを取得できません。GridView
Tab 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;
}
VisualTreeHelper
Header プロパティ内の要素を取得できないと確信していますが、 WPF インスペクターは正しく動作します。
ツリーをトラバースするために別のアプローチを使用しているのだろうか(おそらく検査Properties
もHeader
)。提案?