public static void DisposeSubTree(this UIElement @this)
{
int childrenCount = VisualTreeHelper.GetChildrenCount(@this);
for (int iChild = 0; iChild < childrenCount; iChild++) {
UIElement child = VisualTreeHelper.GetChild(@this, iChild) as UIElement;
if (child != null) {
if (child is IDisposable) {
((IDisposable)child).Dispose();
// Don't descend into the visual tree of an element we
// just disposed. We rely on the element to properly
// dispose its content.
} else {
DisposeSubTree(child);
}
}
}
}