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(); }
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); }
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); }