diff --git a/src/Ursa/Controls/AutoCompleteBox/AutoCompleteBox.cs b/src/Ursa/Controls/AutoCompleteBox/AutoCompleteBox.cs index 423c840..17e7d13 100644 --- a/src/Ursa/Controls/AutoCompleteBox/AutoCompleteBox.cs +++ b/src/Ursa/Controls/AutoCompleteBox/AutoCompleteBox.cs @@ -1,14 +1,11 @@ -using System.Diagnostics; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Controls.Primitives; +using Avalonia.Controls.Templates; using Avalonia.Input; using Avalonia.Interactivity; using Irihi.Avalonia.Shared.Contracts; namespace Ursa.Controls; -public class AutoCompleteBox: Avalonia.Controls.AutoCompleteBox, IClearControl +public class AutoCompleteBox : Avalonia.Controls.AutoCompleteBox, IClearControl { static AutoCompleteBox() { @@ -19,24 +16,25 @@ public class AutoCompleteBox: Avalonia.Controls.AutoCompleteBox, IClearControl { AddHandler(PointerPressedEvent, OnBoxPointerPressed, RoutingStrategies.Tunnel); } - - private void OnBoxPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (Equals(sender, this) && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) - { - SetCurrentValue(IsDropDownOpenProperty, true); - } - } - - protected override void OnGotFocus(GotFocusEventArgs e) - { - base.OnGotFocus(e); - if (IsDropDownOpen) return; - SetCurrentValue(IsDropDownOpenProperty, true); - } public void Clear() { SetCurrentValue(SelectedItemProperty, null); } + + private void OnBoxPointerPressed(object? sender, PointerPressedEventArgs e) + { + if (Equals(sender, this) && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed && IsDropDownOpen == false) + SetCurrentValue(IsDropDownOpenProperty, true); + } + + protected override void OnGotFocus(GotFocusEventArgs e) + { + base.OnGotFocus(e); + // If the focus is set by pointer navigation, it is handled by PointerPressed, do not open the dropdown. + if (e.NavigationMethod == NavigationMethod.Pointer) return; + if (!this.GetTemplateChildren().Contains(e.Source)) return; + // If the focus is set by keyboard navigation, open the dropdown. + if (IsDropDownOpen == false) SetCurrentValue(IsDropDownOpenProperty, true); + } } \ No newline at end of file