public static void AddChildWindow(WindowInformation information)
 {
     if (!information.CoreView.IsMain)
     {
         _childWindows.Add(information.View.Id, information);
     }
 }
        public static async Task TrySwitchToWindowAsync(WindowInformation info, bool main)
        {
            if (main && !CoreApplication.MainView.Dispatcher.HasThreadAccess)
            {
                // Awaiter here is screwed without a *PROPER* dispatcher awaiter
                await CoreApplication.MainView.Dispatcher.RunAsync(
                    CoreDispatcherPriority.Normal, () =>
                {
                    _ = TrySwitchToWindowAsync(info, main);
                }).AsTask();

                return;
            }

            if (main && CoreApplication.MainView.CoreWindow.Visible)
            {
                await ApplicationViewSwitcher.SwitchAsync(
                    info.View.Id,
                    ((WindowInformation)CoreApplication.MainView.Properties[nameof(MainWindow)]).View.Id,
                    ApplicationViewSwitchingOptions.ConsolidateViews).AsTask();

                return;
            }

            if (info == MainWindow)
            {
                await ActivateMainWindowAsync();
            }

            var view = CoreApplication.Views.FirstOrDefault(v => v != CoreApplication.MainView) ?? CoreApplication.MainView;
            await view.Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
            {
                _ = ApplicationViewSwitcher.TryShowAsStandaloneAsync(info.View.Id, ViewSizePreference.Default);
            }).AsTask();
        }
示例#3
0
        public static async Task <WindowInformation> CreateViewAsync(Action a, bool mainView)
        {
            WindowInformation   info = null;
            CoreApplicationView view = null;

            if (mainView)
            {
                view = CoreApplication.MainView;
            }
            else
            {
                if (CoreApplication.MainView.Properties.ContainsKey(nameof(MainWindow)))
                {
                    view = CoreApplication.CreateNewView();
                }
                else
                {
                    view = CoreApplication.MainView;
                }
            }

            void Create()
            {
                a();
                info = WindowInformation.CreateForCurrentView();

                if (!mainView)
                {
                    info.View.SetDesiredBoundsMode(ApplicationViewBoundsMode.UseVisible);
                }

                if (view != CoreApplication.MainView)
                {
                    info.Manager.StartViewInUse();
                    info.Manager.Released += Manager_Released;
                    AddChildWindow(info);
                }
                else
                {
                    view.Properties[nameof(MainWindow)] = info;

                    if (mainView)
                    {
                        MainWindow = info;
                    }
                }
            }

            if (view.Dispatcher.HasThreadAccess)
            {
                Create();
            }
            else
            {
                await view.Dispatcher.RunAsync(CoreDispatcherPriority.High, Create);
            }

            return(info);
        }
示例#4
0
        private static void Manager_Released(object sender, EventArgs e)
        {
            ViewLifetimeManager manager = (ViewLifetimeManager)sender;

            manager.Released -= Manager_Released;

            WindowInformation info = _childWindows[manager.Id];

            _childWindows.Remove(manager.Id);

            _ = info.CoreView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                Window.Current.Close();
            });
        }
        public static async Task <WindowInformation> CreateViewAsync(Action a, bool mainView)
        {
            WindowInformation   info = null;
            CoreApplicationView view = null;

            if (mainView)
            {
                view = CoreApplication.MainView;
            }
            else
            {
                TaskCompletionSource <CoreApplicationView> tcs = new TaskCompletionSource <CoreApplicationView>();

                await CoreApplication.MainView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    if (CoreApplication.MainView.Dispatcher.HasThreadAccess &&
                        CoreApplication.MainView.Properties.ContainsKey(nameof(MainWindow)))
                    {
                        tcs.SetResult(CoreApplication.CreateNewView());
                    }
                    else
                    {
                        tcs.SetResult(CoreApplication.MainView);
                    }
                });

                view = await tcs.Task;
            }

            void Create()
            {
                a();
                info = WindowInformation.CreateForCurrentView();

                if (!mainView)
                {
                    info.View.SetDesiredBoundsMode(ApplicationViewBoundsMode.UseVisible);
                }

                if (view != CoreApplication.MainView)
                {
                    info.Manager.StartViewInUse();
                    info.Manager.Released += Manager_Released;
                    AddChildWindow(info);
                }
                else
                {
                    view.Properties[nameof(MainWindow)] = info;

                    if (mainView)
                    {
                        MainWindow = info;
                    }
                }

                var settings = ResourceHelper.AppSettings;

                settings.UpdateTransparency(settings.IsTransparencyEnabled);
            }

            void DoCreate()
            {
                Create();
                if (Window.Current.Content is FrameworkElement f)
                {
                    f.RequestedTheme = ResourceHelper.AppSettings.UserRequestedTheme;
                }
            }

            if (view.Dispatcher.HasThreadAccess)
            {
                DoCreate();
            }
            else
            {
                await view.Dispatcher.RunAsync(CoreDispatcherPriority.High, DoCreate);
            }

            return(info);
        }