protected void OnDialogOpened(DialogOpenedEventArgs eventArgs) { RaiseEvent(eventArgs); }
private static void IsOpenPropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) { var dialogHost = (DialogHost)dependencyObject; if (dialogHost._popupContentControl != null) { ValidationAssist.SetSuppress(dialogHost._popupContentControl, !dialogHost.IsOpen); } VisualStateManager.GoToState(dialogHost, dialogHost.SelectState(), !TransitionAssist.GetDisableTransitions(dialogHost)); if (dialogHost.IsOpen) { WatchWindowActivation(dialogHost); } else { dialogHost._attachedDialogClosingEventHandler = null; if (dialogHost._currentSnackbarMessageQueueUnPauseAction != null) { dialogHost._currentSnackbarMessageQueueUnPauseAction(); dialogHost._currentSnackbarMessageQueueUnPauseAction = null; } dialogHost.CurrentSession.IsEnded = true; dialogHost.CurrentSession = null; dialogHost._closeCleanUp(); //NB: _dialogTaskCompletionSource is only set in the case where the dialog is shown with Show //To get into this case you need to display the dialog with Show and then hide it by setting IsOpen to false //Setting this here ensures the other dialogHost._dialogTaskCompletionSource?.TrySetResult(null); // Don't attempt to Invoke if _restoreFocusDialogClose hasn't been assigned yet. Can occur // if the MainWindow has started up minimized. Even when Show() has been called, this doesn't // seem to have been set. dialogHost.Dispatcher.InvokeAsync(() => dialogHost._restoreFocusDialogClose?.Focus(), DispatcherPriority.Input); return; } dialogHost.CurrentSession = new DialogSession(dialogHost); var window = Window.GetWindow(dialogHost); dialogHost._restoreFocusDialogClose = window != null?FocusManager.GetFocusedElement(window) : null; //multiple ways of calling back that the dialog has opened: // * routed event // * the attached property (which should be applied to the button which opened the dialog // * straight forward dependency property // * handler provided to the async show method var dialogOpenedEventArgs = new DialogOpenedEventArgs(dialogHost.CurrentSession, DialogOpenedEvent); dialogHost.OnDialogOpened(dialogOpenedEventArgs); dialogHost._attachedDialogOpenedEventHandler?.Invoke(dialogHost, dialogOpenedEventArgs); dialogHost.DialogOpenedCallback?.Invoke(dialogHost, dialogOpenedEventArgs); dialogHost._asyncShowOpenedEventHandler?.Invoke(dialogHost, dialogOpenedEventArgs); dialogHost.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => { CommandManager.InvalidateRequerySuggested(); UIElement child = dialogHost.FocusPopup(); if (child != null) { //https://github.com/ButchersBoy/MaterialDesignInXamlToolkit/issues/187 //totally not happy about this, but on immediate validation we can get some weird looking stuff...give WPF a kick to refresh... Task.Delay(300).ContinueWith(t => child.Dispatcher.BeginInvoke(new Action(() => child.InvalidateVisual()))); } })); }