public static void EnumerateTree(Visual reference, EnumerateTreeFilterCallback filterCallback, EnumerateTreeResultCallback enumeratorCallback, object misc) { if (reference == null) { throw new ArgumentNullException("reference"); } DoEnumerateTree(reference, filterCallback, enumeratorCallback, misc); }
static bool DoEnumerateTree(object reference, EnumerateTreeFilterCallback filterCallback, EnumerateTreeResultCallback enumeratorCallback, object misc) { for (var i = 0; i < CommonTreeHelper.GetChildrenCount(reference); ++i) { var child = CommonTreeHelper.GetChild(reference, i); var filterResult = HitTestFilterBehavior.Continue; if (filterCallback != null) { filterResult = filterCallback(child, misc); } var enumerateSelf = true; var enumerateChildren = true; switch (filterResult) { case HitTestFilterBehavior.Continue: break; case HitTestFilterBehavior.ContinueSkipChildren: enumerateChildren = false; break; case HitTestFilterBehavior.ContinueSkipSelf: enumerateSelf = false; break; case HitTestFilterBehavior.ContinueSkipSelfAndChildren: enumerateChildren = false; enumerateSelf = false; break; default: return(false); } if ( (enumerateSelf && enumeratorCallback != null && enumeratorCallback(child, misc) == HitTestResultBehavior.Stop) || (enumerateChildren && !DoEnumerateTree(child, filterCallback, enumeratorCallback, misc)) ) { return(false); } } return(true); }
private static bool DoEnumerateTree(DependencyObject reference, EnumerateTreeFilterCallback filterCallback, EnumerateTreeResultCallback enumeratorCallback, object misc) { for (var i = 0; i < VisualTreeHelper.GetChildrenCount(reference); ++i) { var child = VisualTreeHelper.GetChild(reference, i); var filterResult = filterCallback?.Invoke(child, misc) ?? HitTestFilterBehavior.Continue; var enumerateSelf = true; var enumerateChildren = true; switch (filterResult) { case HitTestFilterBehavior.Continue: break; case HitTestFilterBehavior.ContinueSkipChildren: enumerateChildren = false; break; case HitTestFilterBehavior.ContinueSkipSelf: enumerateSelf = false; break; case HitTestFilterBehavior.ContinueSkipSelfAndChildren: enumerateChildren = false; enumerateSelf = false; break; default: return(false); } if ((enumerateSelf && enumeratorCallback?.Invoke(child, misc) == HitTestResultBehavior.Stop) || (enumerateChildren && DoEnumerateTree(child, filterCallback, enumeratorCallback, misc) == false)) { return(false); } } return(true); }
public static void EnumerateTree(this Visual visual, EnumerateTreeFilterCallback filterCallback, EnumerateTreeResultCallback enumeratorCallback, object misc) { if (visual == null) { throw new ArgumentNullException(nameof(visual)); } DoEnumerateTree(visual, filterCallback, enumeratorCallback, misc); }
public static void EnumerateTree(this Visual @this, EnumerateTreeFilterCallback filterCallback, EnumerateTreeResultCallback enumeratorCallback, object misc) { if (@this == null) { throw new ArgumentNullException("this"); } DoEnumerateTree(@this, filterCallback, enumeratorCallback, misc); }