public void FlyoutTo(Type type, object parameter = null) { if (type == null) { throw new ArgumentNullException(nameof(type)); } if (!this.IsFlyoutAllowed()) { this.Navigate(type, parameter); } else { var currentFlyoutControl = this.PeekFlyout(); if (currentFlyoutControl != null && currentFlyoutControl.Content.GetType() == type) { // if this flyout is currently opened, signal new parameter if (currentFlyoutControl.Content is ISettingsPage) { ((ISettingsPage)currentFlyoutControl.Content).OnNavigatedTo(parameter); } return; } SettingsSizeMode size = SettingsSizeMode.Small; object content = null; if (type == typeof(TaskPage)) { // only cache TaskPage because of side effects with other pages + // for memory usage (TaskPage is the only one used many times during the lifetime // of the app) if (!this.flyoutsCache.ContainsKey(type)) { this.flyoutsCache.Add(type, Activator.CreateInstance(type)); } content = this.flyoutsCache[type]; } else { content = Activator.CreateInstance(type); } if (content is Page) { Page page = (Page)content; if (page is ISettingsPage) { ISettingsPage settingsPage = (ISettingsPage)content; size = settingsPage.Size; settingsPage.OnNavigatedTo(parameter); } else { size = SettingsSizeMode.Small; } } var flyoutControl = new FlyoutControl { Content = content, Size = size, StaysOpen = true }; flyoutControl.Show(this.OnFlyoutClosed); this.flyouts.Push(flyoutControl); } }