private static Window SetupExternalDialogWindow(BaseMetroDialog dialog) { MetroWindow win = new MetroWindow(); win.ShowInTaskbar = false; win.ShowActivated = true; win.Topmost = true; win.ResizeMode = ResizeMode.NoResize; win.WindowStyle = WindowStyle.None; win.WindowStartupLocation = WindowStartupLocation.CenterScreen; win.ShowTitleBar = false; win.ShowCloseButton = false; win.WindowTransitionsEnabled = false; win.Background = dialog.Background; try { win.GlowBrush = win.TryFindResource("AccentColorBrush") as SolidColorBrush; } catch (Exception) { } win.Width = SystemParameters.PrimaryScreenWidth; win.MinHeight = SystemParameters.PrimaryScreenHeight / 4.0; win.SizeToContent = SizeToContent.Height; GlowWindowBehavior glowWindow = new GlowWindowBehavior(); glowWindow.Attach(win); dialog.ParentDialogWindow = win; //THIS IS ONLY, I REPEAT, ONLY SET FOR EXTERNAL DIALOGS! win.Content = dialog; EventHandler closedHandler = null; closedHandler = (sender, args) => { win.Closed -= closedHandler; dialog.ParentDialogWindow = null; win.Content = null; }; win.Closed += closedHandler; return win; }
/// <summary> /// Hides a visible Metro Dialog instance. /// </summary> /// <param name="window">The window with the dialog that is visible.</param> /// <param name="dialog">The dialog instance to hide.</param> /// <returns>A task representing the operation.</returns> /// <exception cref="InvalidOperationException"> /// The <paramref name="dialog"/> is not visible in the window. /// This happens if <see cref="ShowMetroDialogAsync"/> hasn't been called before. /// </exception> public static Task HideMetroDialogAsync(this MetroWindow window, BaseMetroDialog dialog) { window.Dispatcher.VerifyAccess(); if (!window.metroDialogContainer.Children.Contains(dialog)) throw new InvalidOperationException("The provided dialog is not visible in the specified window."); window.SizeChanged -= dialog.SizeChangedHandler; dialog.OnClose(); Task closingTask = (Task)window.Dispatcher.Invoke(new Func<Task>(() => dialog._WaitForCloseAsync())); return closingTask.ContinueWith<Task>(a => { if (DialogClosed != null) { window.Dispatcher.BeginInvoke(new Action(() => DialogClosed(window, new DialogStateChangedEventArgs() { }))); } return (Task)window.Dispatcher.Invoke(new Func<Task>(() => { window.metroDialogContainer.Children.Remove(dialog); //remove the dialog from the container return window.HideOverlayAsync(); })); }).Unwrap(); }
private static SizeChangedEventHandler SetupAndOpenDialog(MetroWindow window, BaseMetroDialog dialog) { dialog.SetValue(Panel.ZIndexProperty, (int)window.overlayBox.GetValue(Panel.ZIndexProperty) + 1); dialog.MinHeight = window.ActualHeight / 4.0; dialog.MaxHeight = window.ActualHeight; SizeChangedEventHandler sizeHandler = null; //an event handler for auto resizing an open dialog. sizeHandler = new SizeChangedEventHandler((sender, args) => { dialog.MinHeight = window.ActualHeight / 4.0; dialog.MaxHeight = window.ActualHeight; }); window.SizeChanged += sizeHandler; //window.overlayBox.Visibility = Visibility.Visible; //activate the overlay effect window.metroDialogContainer.Children.Add(dialog); //add the dialog to the container dialog.OnShown(); return sizeHandler; }
/// <summary> /// Adds a Metro Dialog instance to the specified window and makes it visible. /// <para>Note that this method returns as soon as the dialog is loaded and won't wait on a call of <see cref="HideMetroDialogAsync"/>.</para> /// <para>You can still close the resulting dialog with <see cref="HideMetroDialogAsync"/>.</para> /// </summary> /// <param name="window">The owning window of the dialog.</param> /// <param name="dialog">The dialog instance itself.</param> /// <returns>A task representing the operation.</returns> /// <exception cref="InvalidOperationException">The <paramref name="dialog"/> is already visible in the window.</exception> public static Task ShowMetroDialogAsync(this MetroWindow window, BaseMetroDialog dialog) { window.Dispatcher.VerifyAccess(); if (window.metroDialogContainer.Children.Contains(dialog)) throw new InvalidOperationException("The provided dialog is already visible in the specified window."); return window.ShowOverlayAsync().ContinueWith(z => { dialog.Dispatcher.Invoke(new Action(() => { SizeChangedEventHandler sizeHandler = SetupAndOpenDialog(window, dialog); dialog.SizeChangedHandler = sizeHandler; })); }).ContinueWith(y => ((Task)dialog.Dispatcher.Invoke(new Func<Task>(() => dialog.WaitForLoadAsync().ContinueWith(x => { dialog.OnShown(); if (DialogOpened != null) { DialogOpened(window, new DialogStateChangedEventArgs() { }); } }))))); }