从上图可以看到,一个普通的Button控件,在可视化(对象)树里表现为:ButtomChrome,ContentPresenter,TextBlock的组合 另外Silverlight中提供了一个VisualTreeHelper } private void btnClick_Click(object sender, RoutedEventArgs e) { int _childCount = VisualTreeHelper.GetChildrenCount [{1}]的内容为:{2}",i,btn.Name,btn.Content)); } StackPanel sp = VisualTreeHelper.GetParent IEnumerable<T> FindChildren<T>(DependencyObject parent) where T : class { var count = VisualTreeHelper.GetChildrenCount 0) { for (var i = 0; i < count; i++) { var child = VisualTreeHelper.GetChild
if (parent == null) return null; T foundChild = null; int childrenCount = VisualTreeHelper.GetChildrenCount parent); for (int i = 0; i < childrenCount; i++) { var child = VisualTreeHelper.GetChild = null) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) { DependencyObject child = VisualTreeHelper.GetChild(depObj,
(this) == null) { return; } var sourceBounds = VisualTreeHelper.GetContentBounds (_source); if (sourceBounds.IsEmpty) { sourceBounds = VisualTreeHelper.GetDescendantBounds (_destination); if (destinationBounds.IsEmpty) { destinationBounds = VisualTreeHelper.GetDescendantBounds { return; } var sourceBounds = VisualTreeHelper.GetContentBounds (source, 0); var animatingDestination = (UIElement) VisualTreeHelper.GetChild(destination, 0);
(dep is ListBoxItem)) { dep = VisualTreeHelper.GetParent(dep); if (parent == null) return null; T foundChild = null; int childrenCount = VisualTreeHelper.GetChildrenCount parent); for (int i = 0; i < childrenCount; i++) { var child = VisualTreeHelper.GetChild parent); for (int i = 0; i < childrenCount; i++) { var child = VisualTreeHelper.GetChild <T>(DependencyObject i_dp) where T : DependencyObject { DependencyObject dobj = VisualTreeHelper.GetParent
T>(DependencyObject obj,string childName) where T : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount (obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); } return null; } } public class TestData{public string d{set;get;}} } 这里我们借助VisualTreeHelper
builder.AppendLine($"{name}({element.GetType().FullName})\r\n"); for (var i = 0; i < VisualTreeHelper.GetChildrenCount element); i++) { using var t = builder.Indent(); var child = VisualTreeHelper.GetChild
DependencyObject> GetVisualSiblingsAndSelf(this DependencyObject element) { } } VisualTreeExtensions封装了VisualTreeHelper 所谓的最好,是因为WPF、Silverlight、UWP控件的生命周期有一些出入,我一时记不太清楚了,总之根据经验运行这个函数的时候可能Visual Tree还没有构建好,VisualTreeHelper 参考 VisualTreeHelper Class (System.Windows.Media) _ Microsoft Docs FrameworkElement.GetTemplateChild(String
通过 VisualTreeHelper.GetParent找到它的父元素,调用父元素的InvalidateArrange再次触发ArrangeOverride函数。 譬如在上面的代码中,假设VisualTreeHelper.GetParent是一个很耗时的操作(只是假设),我会把parent放到缓存里面,而这个缓存还是用附加属性实现的。 return; var parent = GetCanvasParent(obj); if (parent == null) { parent = VisualTreeHelper.GetParent = null) parent.InvalidateArrange(); } 注意: 实际上VisualTreeHelper.GetParent函数并没有十分耗时,所以这里是没必要这样写的 (double)args.NewValue; if (oldValue == newValue) return; var parent = VisualTreeHelper.GetParent
element) { if (element == null) return null; ScrollViewer retour = null; for (int i = 0; i < VisualTreeHelper.GetChildrenCount (element) && retour == null; i++) { if (VisualTreeHelper.GetChild(element, i) is ScrollViewer ) { retour = (ScrollViewer)(VisualTreeHelper.GetChild(element, i)); } else { retour = GetScrollViewer(VisualTreeHelper.GetChild(element, i) as UIElement
return true; } target = System.Windows.Media.VisualTreeHelper.GetParent
// // 寻找创建时的屏幕时,会寻找 PlacementTarget 和 VisualTreeHelper.GetContainingVisual2D(VisualTreeHelper.GetParent
static T GetVisualChild<T>(Visual parent) where T : Visual { T child = default(T); int numVisuals = VisualTreeHelper.GetChildrenCount (parent); for (int i = 0; i < numVisuals; i++) { Visual v = (Visual)VisualTreeHelper.GetChild
GetCustomTagControl(DependencyObject control, string name) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount (control); i++) { DependencyObject child = VisualTreeHelper.GetChild(control
ActivatedInForeground: case CoreWindowActivationMode::ActivatedNotForeground: auto elements = VisualTreeHelper invokable->IsInvokable) { element = dynamic_cast<UIElement^>(VisualTreeHelper safe_cast<PivotHeaderItem^>(TargetElement); auto headerPanel = safe_cast<PivotHeaderPanel^>(VisualTreeHelper DependencyObject^ walker = headerPanel; Pivot^ pivot; do { walker = VisualTreeHelper
GetChild(DependencyObject root, Func<object, bool> predicate) { var childrenCount = VisualTreeHelper.GetChildrenCount root); for (var i = 0; i < childrenCount; i++) { var child = VisualTreeHelper.GetChild
需要在实际用到绘制的时候,才会调用 DirectX 进行绘制,例如调用 RenderTargetBitmap 的 Render 方法,将绘制的指令转换为绘制为内存的图片 var dpiScale = VisualTreeHelper.GetDpi drawingContext.DrawLine(new Pen(Brushes.Black, 2), new Point(2, 5), new Point(90, 5)); } var dpiScale = VisualTreeHelper.GetDpi
至此,第三个问题解决了: var firstColumn = VisualTreeHelper.GetChild(rowPresenter, 0) as UIElement; 最后一个问题,是过程中最麻烦的一个问题 就知道如何计算出第一列的最终宽度了: private double GetFirstColumnDesiredWidth() { var rowPresenter = this.FindGridRow(); if (VisualTreeHelper.GetChildrenCount var firstColumn = VisualTreeHelper.GetChild(rowPresenter, 0) as UIElement; var desiredWidth = firstColumn.DesiredSize.Width
IEnumerable<T> FindChildren<T>(DependencyObject parent) where T : class { int count = VisualTreeHelper.GetChildrenCount for (int i = 0; i < count; i++) { DependencyObject child = VisualTreeHelper.GetChild
parent) where T : Visual { T childContent = default(T); int numVisuals = VisualTreeHelper.GetChildrenCount ; for (int i = 0; i < numVisuals; i++) { Visual v = (Visual)VisualTreeHelper.GetChild
遍历可视化树可以简单的使用VisualTreeHelper和简单的递归方法。WPF提供了两个辅助类(LogicalTreeHelper and VisualTreeHelper)来操作这两棵树。