예제 #1
0
        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);
            }
        }