diff --git a/src/Files.App.Controls/Omnibar/Omnibar.Events.cs b/src/Files.App.Controls/Omnibar/Omnibar.Events.cs index 0c9c46ca386c..c3065f4780de 100644 --- a/src/Files.App.Controls/Omnibar/Omnibar.Events.cs +++ b/src/Files.App.Controls/Omnibar/Omnibar.Events.cs @@ -56,6 +56,14 @@ private void AutoSuggestBox_LostFocus(object sender, RoutedEventArgs e) IsFocused = false; IsFocusedChanged?.Invoke(this, new(IsFocused)); + + // Workaround to prevent an issue where if the window loses focus and then regains focus, + // the AutoSuggestBox will regain focus and the suggestions popup will open again. + if (element is TextBox) + { + _previouslyFocusedElement.TryGetTarget(out var previouslyFocusedElement); + previouslyFocusedElement?.Focus(FocusState.Programmatic); + } } private async void AutoSuggestBox_KeyDown(object sender, KeyRoutedEventArgs e) diff --git a/src/Files.App/Data/Contracts/IAddressToolbarViewModel.cs b/src/Files.App/Data/Contracts/IAddressToolbarViewModel.cs index f3345d435dc5..56ce2713f646 100644 --- a/src/Files.App/Data/Contracts/IAddressToolbarViewModel.cs +++ b/src/Files.App/Data/Contracts/IAddressToolbarViewModel.cs @@ -31,7 +31,5 @@ public interface IAddressToolbarViewModel public event ItemDraggedOverPathItemEventHandler ItemDraggedOverPathItem; public event EventHandler RefreshWidgetsRequested; - - public void SwitchToSearchMode(); } } diff --git a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs index e45120940a4e..586f2b8d0838 100644 --- a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs +++ b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs @@ -602,16 +602,26 @@ public void SwitchToCommandPaletteMode() OmnibarCurrentSelectedModeName = OmnibarPaletteModeName; } - public void SwitchToSearchMode() + public async Task SwitchToSearchMode() { + // If the Omnibar is already focused such as when the user initiates a search via the Command Palette, + // add a short delay to allow the Command Palette to fully close before switching modes. + var omnibar = AddressToolbar?.FindDescendant("Omnibar") as Omnibar; + if (omnibar is not null && omnibar.IsFocused) + await Task.Delay(100); + OmnibarCurrentSelectedModeName = OmnibarSearchModeName; } - public void SwitchToPathMode() + public async Task SwitchToPathMode() { - OmnibarCurrentSelectedModeName = OmnibarPathModeName; - + // If the Omnibar is already focused such as when the user initiates the Edit Path action via the + // Command Palette, add a short delay to allow the Command Palette to fully close before switching modes. var omnibar = AddressToolbar?.FindDescendant("Omnibar") as Omnibar; + if (omnibar is not null && omnibar.IsFocused) + await Task.Delay(100); + + OmnibarCurrentSelectedModeName = OmnibarPathModeName; omnibar?.Focus(FocusState.Programmatic); omnibar.IsFocused = true; } @@ -997,8 +1007,7 @@ await Task.Run(() => HotKeys = command.HotKeys, SearchText = OmnibarCommandPaletteModeText, }) - .Where(item => item.Text != Commands.OpenCommandPalette.Description.ToString() - && item.Text != Commands.EditPath.Description.ToString()); + .Where(item => item.Text != Commands.OpenCommandPalette.Description.ToString()); }); newSuggestions.AddRange(suggestionItems);