private void Show(Type idType, string instanceId, object parameter, bool isPopup) { var key = new NamedType(idType, instanceId); ScreenHost host; if (_screens.TryGetValue(key, out host)) { host.BringToFront(isPopup); return; } ScreenFactory factory; if (!_factories.TryGetValue(key.Type, out factory)) { return; } IScreen logic; TBaseView view; Exception e; if (!factory.TryCreate(instanceId, parameter, out logic, out view, out e)) { OnException(string.Format("Unable to create screen: {0}", key), e); return; } host = new ScreenHost(key, view, logic, CreateScreen, CreatePopup, factory.PopupAttribute); _screens.Add(key, host); host.Closed += OnHostClosed; var setupable = logic as IInternalScreen; if (setupable != null) { setupable.Setup(host.Close); } if (!host.Restore(_persistenceService, out e)) { OnException(string.Format("Unable to restore screen: {0}", key), e); } host.Show(isPopup); }
private ScreenHost CreateScreenHost(Type idType, string instanceId, Func <IInternalScreen, object> getParameter, bool isPopup, PopupAttribute popupAttribute = null) { var key = new NamedType(idType, instanceId); if (_screens.TryGetValue(key, out var host)) { host.BringToFront(isPopup); return(null); } if (!_factories.TryGetValue(key.Type, out var factory)) { return(null); } if (!factory.TryCreate(instanceId, getParameter, out var logic, out var view, out var e)) { OnException($"Unable to create screen: {key}", e); return(null); } popupAttribute = popupAttribute ?? factory.PopupAttribute; host = new ScreenHost(key, view, logic, CreateScreen, ShowScreen, CreatePopup, ShowPopup, popupAttribute); _screens.Add(key, host); host.Closed += OnHostClosed; if (logic is IInternalScreen internalScreen) { internalScreen.Setup(host.Close); } if (!host.Restore(_persistenceService, out e)) { OnException($"Unable to restore screen: {key}", e); } return(host); }