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(); } }