internal static IEnumerable<FrameworkElement> GetLogicalChildrenBreadthFirst(this FrameworkElement parent)
{
Debug.Assert(parent != null, "The parent cannot be null.");
Queue<FrameworkElement> queue =
new Queue<FrameworkElement>(parent.GetVisualChildren().OfType<FrameworkElement>());
while(queue.Count > 0)
{
FrameworkElement element = queue.Dequeue();
yield return element;
foreach(FrameworkElement visualChild in element.GetVisualChildren().OfType<FrameworkElement>())
{
queue.Enqueue(visualChild);
}
}
}
}