Walking the Visual Tree in Avalon

Sometimes you just need to walk the tree of Visuals in Avalon.  It's easy to do, but it is even easier if you have a nice Visitor-pattern implementing tree walker.  So:

 

  using System;
   using System.Collections;
   using System.Diagnostics;
   using System.Windows;
   using System.Windows.Controls;
  using System.Windows.Media;
 using System.Windows.Media.Media3D;

 public delegate void VisualVisitor(Visual v, int depth);

    public class VisualTreeWalker
   {
       private Visual root;
        private int visualCount;

        public event VisualVisitor VisualVisited;

       public VisualTreeWalker(Visual root)
        {
           this.root = root;
       }

       public int Walk()
       {
           this.visualCount = 0;
           this.RecurseVisuals(this.root, 1);
          return this.visualCount;
        }

       private void RecurseVisuals(Visual visual, int currentDepth)
        {
           this.visualCount++;
         this.OnVisualVisit(visual, currentDepth);

           foreach (Visual child in VisualOperations.GetChildren(visual))
          {
               this.RecurseVisuals(child, currentDepth + 1);
           }
       }

       private void OnVisualVisit(Visual v, int currentDepth)
      {
           if (this.VisualVisited != null)
         {
               this.VisualVisited(v, currentDepth);
            }
       }
   }