private void AddViewAfterLoaded(UninitializedViewInfo uninitializedViewInfo)
{
var isTopViewStack = true;
var viewLoadState = uninitializedViewInfo.ViewLoadState;
var view = viewLoadState.View;
ViewStack viewStack = null;
var parent = view.FindParentByPredicate(x => x is IView) as FrameworkElement;
if (parent != null)
{
if (_uninitializedViews.ContainsKey(parent))
{
// We have a different uninitialized view that is the parent
var uninitializedParent = _uninitializedViews[parent];
uninitializedParent.ViewStack.AddChild(uninitializedViewInfo.ViewStack, uninitializedParent.ViewStack);
isTopViewStack = false;
}
else
{
// We are now listed to be added to the visual tree
foreach (var existingViewStack in _viewStacks)
{
if (existingViewStack.ContainsView((IView)parent))
{
var viewAsFrameworkElement = view as FrameworkElement;
if (viewAsFrameworkElement != null && _uninitializedViews.ContainsKey(viewAsFrameworkElement))
{
// This happens when we are called from OnFrameworkElementLoaded but out parent wasn't updated yet
existingViewStack.AddChild(_uninitializedViews[viewAsFrameworkElement].ViewStack, existingViewStack);
}
else
{
existingViewStack.AddChild(view, existingViewStack);
}
viewStack = existingViewStack;
isTopViewStack = false;
break;
}
}
}
}
if (isTopViewStack)
{
var topViewStack = uninitializedViewInfo.ViewStack;
topViewStack.ViewStackLoaded += OnViewStackLoaded;
topViewStack.ViewStackUnloaded += OnViewStackUnloaded;
_viewStacks.Add(topViewStack);
viewStack = topViewStack;
}
if (viewStack != null)
{
viewStack.NotifyThatParentIsReadyToAcceptLoadedMessages();
}
}