private static void LogicalDisplayerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is Panel panel) { LogicalDisplayers.Add(panel); } }
private static void MouseUpLogical(object sender, MouseButtonEventArgs e) { if (e.OriginalSource is DependencyObject) { DependencyObject currentElement = e.OriginalSource as DependencyObject; LogicalDisplayers.ForEach(d => d.Children.Clear()); bool print = true; do { if (print) { foreach (var item in LogicalDisplayers) { TextBlock block = new TextBlock(); block.Text = currentElement.ToString(); if (currentElement is FrameworkElement element) { block.ToolTip = "DataContext: " + element.DataContext?.ToString(); } else if (currentElement is FrameworkContentElement celement) { block.ToolTip = "DataContext: " + celement.DataContext?.ToString(); } item.Children.Add(block); } } print = true; DependencyObject nextElement = LogicalTreeHelper.GetParent(currentElement); if (nextElement == null) { if (currentElement is FrameworkElement fe) { nextElement = fe.TemplatedParent ?? fe.Parent; } else if (currentElement is FrameworkContentElement fce) { nextElement = fce.TemplatedParent ?? fce.Parent; } if (nextElement == null) { nextElement = VisualTreeHelper.GetParent(currentElement); print = false; } } currentElement = nextElement; } while (currentElement != null); } }