Skip to content

Instantly share code, notes, and snippets.

@mqudsi
Created August 20, 2021 16:14
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mqudsi/86e336004b68f8a38248122f1bec9d8b to your computer and use it in GitHub Desktop.
Save mqudsi/86e336004b68f8a38248122f1bec9d8b to your computer and use it in GitHub Desktop.
Create a blocking/modal dialog with a new window on UWP. No dependencies.
private async void Settings_Click(object sender, PointerRoutedEventArgs e)
{
var mainViewId = ApplicationView.GetForCurrentView().Id;
CoreApplicationView newView = CoreApplication.CreateNewView();
int newViewId = 0;
var popupClosed = new TaskCompletionSource<bool>();
Window settingsWindow = null;
var mainWindow = Window.Current;
bool settingsClosing = false;
async void FocusSettingsDialog(object sender, dynamic @event)
{
if (!settingsClosing)
{
await ApplicationViewSwitcher.SwitchAsync(newViewId, mainViewId, ApplicationViewSwitchingOptions.SkipAnimation);
}
}
mainWindow.Activated += FocusSettingsDialog;
await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
Frame frame = new Frame();
frame.Navigate(typeof(SettingsDialog), null);
settingsWindow = Window.Current;
Window.Current.Content = frame;
var page = (SettingsDialog)frame.Content;
// You have to activate the window in order to show it later.
Window.Current.Activate();
newViewId = ApplicationView.GetForCurrentView().Id;
var settingsDialog = (SettingsDialog)frame.Content;
settingsDialog.Closing += async () =>
{
settingsClosing = true;
await mainWindow.Dispatcher.RunAsync(CoreDispatcherPriority.High, () => mainWindow.Activated -= FocusSettingsDialog);
popupClosed.TrySetResult(true);
};
settingsDialog.CancelClicked += async () =>
{
await ApplicationViewSwitcher.SwitchAsync(mainViewId, newViewId, ApplicationViewSwitchingOptions.ConsolidateViews);
};
settingsDialog.SaveClicked += async () =>
{
await ApplicationViewSwitcher.SwitchAsync(mainViewId, newViewId, ApplicationViewSwitchingOptions.ConsolidateViews);
// Save settings here
await settingsDialog.Settings.SaveAsync();
await App.ReloadSettingsAsync();
};
settingsDialog.Settings = App.Settings;
});
bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
var frame = (Frame)Window.Current.Content;
var page = (SettingsDialog)frame.Content;
var resized = ApplicationView.GetForCurrentView().TryResizeView(new Windows.Foundation.Size(page.ActualWidth, page.ActualHeight));
});
await popupClosed.Task;
await ApplicationViewSwitcher.SwitchAsync(mainViewId);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment