diff --git a/MaterialDesignThemes.Wpf/DialogHost.cs b/MaterialDesignThemes.Wpf/DialogHost.cs index ab6fd9e6a4..cf311b2c44 100644 --- a/MaterialDesignThemes.Wpf/DialogHost.cs +++ b/MaterialDesignThemes.Wpf/DialogHost.cs @@ -816,14 +816,37 @@ internal void InternalClose(object? parameter) if (child is null) return null; CommandManager.InvalidateRequerySuggested(); - var focusable = child.VisualDepthFirstTraversal().OfType().FirstOrDefault(ui => ui.Focusable && ui.IsVisible); - focusable?.Dispatcher.InvokeAsync(() => + var focusable = child.VisualDepthFirstTraversal().OfType().FirstOrDefault(ui => ui.Focusable); + if (focusable is null) return null; + + if (focusable.IsVisible) + { + MoveFocus(focusable); + } + else { - if (!focusable.Focus()) return; - focusable.MoveFocus(new TraversalRequest(FocusNavigationDirection.First)); - }, DispatcherPriority.Background); + focusable.IsVisibleChanged += FocusableOnIsVisibleChanged; + } return child; + + void FocusableOnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) + { + if (sender is UIElement focusable) + { + MoveFocus(focusable); + focusable.IsVisibleChanged -= FocusableOnIsVisibleChanged; + } + } + + void MoveFocus(UIElement focusable) + { + focusable.Dispatcher.BeginInvoke(() => + { + if (!focusable.Focus()) return; + focusable.MoveFocus(new TraversalRequest(FocusNavigationDirection.First)); + }, DispatcherPriority.Background); + } } protected override void OnPreviewMouseDown(MouseButtonEventArgs e)