/// <summary> /// Adds the view load state. /// </summary> /// <param name="viewLoadState">The view load state.</param> /// <exception cref="ArgumentNullException">The <paramref name="viewLoadState" /> is <c>null</c>.</exception> public void AddView(IViewLoadState viewLoadState) { Argument.IsNotNull("viewLoadState", viewLoadState); #if SILVERLIGHT var frameworkElement = viewLoadState.View as FrameworkElement; if (frameworkElement != null) { _uninitializedViews[frameworkElement] = new UninitializedViewInfo(viewLoadState); frameworkElement.Loaded += OnFrameworkElementLoaded; } #else var viewInfo = new WeakViewInfo(viewLoadState.View); viewInfo.Loaded += OnViewInfoLoaded; viewInfo.Unloaded += OnViewInfoUnloaded; _views.Add(viewInfo); #endif }
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(); } }