From 640fb5ec1bfcab76fe77bbd06e41ff656daaca9e Mon Sep 17 00:00:00 2001 From: AtomCrafty Date: Wed, 5 Jul 2023 20:12:59 +0200 Subject: [PATCH 1/3] add AutoCompleteBox with MinimumPrefixLength=0 to control gallery --- samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml index a492808f1d..b682ebf51d 100644 --- a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml +++ b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml @@ -18,6 +18,10 @@ + + + + @@ -42,7 +46,6 @@ - From 4b5b6225f1124dfdaedb2b1cb18c997cfe0d8a4c Mon Sep 17 00:00:00 2001 From: AtomCrafty Date: Wed, 5 Jul 2023 20:13:54 +0200 Subject: [PATCH 2/3] fix AutoCompleteBox dropdown not opening when the text box is empty --- .../AutoCompleteBox/AutoCompleteBox.cs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Controls/AutoCompleteBox/AutoCompleteBox.cs b/src/Avalonia.Controls/AutoCompleteBox/AutoCompleteBox.cs index d0b894101f..ebf66164b7 100644 --- a/src/Avalonia.Controls/AutoCompleteBox/AutoCompleteBox.cs +++ b/src/Avalonia.Controls/AutoCompleteBox/AutoCompleteBox.cs @@ -1320,17 +1320,14 @@ namespace Avalonia.Controls // Evaluate the conditions needed for completion. // 1. Minimum prefix length // 2. If a delay timer is in use, use it - bool populateReady = newText.Length >= MinimumPrefixLength && MinimumPrefixLength >= 0; - if (populateReady && MinimumPrefixLength == 0 && String.IsNullOrEmpty(newText) && String.IsNullOrEmpty(SearchText)) - { - populateReady = false; - } - _userCalledPopulate = populateReady ? userInitiated : false; + bool minimumLengthReached = newText.Length >= MinimumPrefixLength && MinimumPrefixLength >= 0; + + _userCalledPopulate = minimumLengthReached && userInitiated; // Update the interface and values only as necessary UpdateTextValue(newText, userInitiated); - if (populateReady) + if (minimumLengthReached) { _ignoreTextSelectionChange = true; From 42ad2fd46e4409874db5235efc1e838c0475f6b1 Mon Sep 17 00:00:00 2001 From: AtomCrafty Date: Wed, 5 Jul 2023 20:59:18 +0200 Subject: [PATCH 3/3] add regression test for AutoCompleteBox with MinimumPrefixLegth=0 --- .../AutoCompleteBoxTests.cs | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs b/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs index acae583b5c..f31df71c0d 100644 --- a/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs @@ -1,21 +1,15 @@ using System; -using System.Collections; using System.Collections.Generic; -using System.ComponentModel; using System.Linq; using Avalonia.Controls.Primitives; -using Avalonia.Controls.Presenters; using Avalonia.Controls.Templates; using Avalonia.Data; -using Avalonia.Markup.Data; -using Avalonia.Platform; using Avalonia.Threading; using Avalonia.UnitTests; -using Moq; using Xunit; using System.Collections.ObjectModel; -using System.Reactive.Linq; using System.Reactive.Subjects; +using Avalonia.Input; namespace Avalonia.Controls.UnitTests { @@ -439,6 +433,29 @@ namespace Avalonia.Controls.UnitTests }); } + [Fact] + public void Explicit_Dropdown_Open_Request_MinimumPrefixLength_0() + { + RunTest((control, textbox) => + { + control.Text = ""; + control.MinimumPrefixLength = 0; + Dispatcher.UIThread.RunJobs(); + + Assert.False(control.IsDropDownOpen); + + control.RaiseEvent(new KeyEventArgs + { + RoutedEvent = InputElement.KeyDownEvent, + Key = Key.Down + }); + + Dispatcher.UIThread.RunJobs(); + + Assert.True(control.IsDropDownOpen); + }); + } + /// /// Retrieves a defined predicate filter through a new AutoCompleteBox /// control instance. @@ -1072,14 +1089,14 @@ namespace Avalonia.Controls.UnitTests private AutoCompleteBox CreateControl() { - var datePicker = + var autoCompleteBox = new AutoCompleteBox { Template = CreateTemplate() }; - datePicker.ApplyTemplate(); - return datePicker; + autoCompleteBox.ApplyTemplate(); + return autoCompleteBox; } private TextBox GetTextBox(AutoCompleteBox control) {