Skip to content

Commit ac1723d

Browse files
Fix manually tested issue where initial character press of overwriting token wasn't being set to box (aggressive if)
Also realized we would no longer raise the text changed event in that scenario, so changed logic for text changed event. We'll need to create integration tests for these keyboard driven scenarios in the new test setup from Labs (when it's finished) in 8.0. These would make good keyboard driver tests.
1 parent 6e94416 commit ac1723d

File tree

1 file changed

+28
-29
lines changed

1 file changed

+28
-29
lines changed

Microsoft.Toolkit.Uwp.UI.Controls.Input/TokenizingTextBox/TokenizingTextBoxItem.AutoSuggestBox.cs

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -101,31 +101,36 @@ private void OnApplyTemplateAutoSuggestBox(AutoSuggestBox auto)
101101
_autoSuggestBox.LostFocus += AutoSuggestBox_LostFocus;
102102

103103
// Setup a binding to the QueryIcon of the Parent if we're the last box.
104-
if (Content is ITokenStringContainer str && str.IsLast)
104+
if (Content is ITokenStringContainer str)
105105
{
106-
// Workaround for https://github.com/microsoft/microsoft-ui-xaml/issues/2568
107-
if (Owner.QueryIcon is FontIconSource fis &&
108-
fis.ReadLocalValue(FontIconSource.FontSizeProperty) == DependencyProperty.UnsetValue)
109-
{
110-
// This can be expensive, could we optimize?
111-
// Also, this is changing the FontSize on the IconSource (which could be shared?)
112-
fis.FontSize = Owner.TryFindResource("TokenizingTextBoxIconFontSize") as double? ?? 16;
113-
}
106+
// We need to set our initial text in all cases.
107+
_autoSuggestBox.Text = str.Text;
114108

115-
var iconBinding = new Binding()
109+
// We only set/bind some properties on the last textbox to mimic the autosuggestbox look
110+
if (str.IsLast)
116111
{
117-
Source = Owner,
118-
Path = new PropertyPath(nameof(Owner.QueryIcon)),
119-
RelativeSource = new RelativeSource() { Mode = RelativeSourceMode.TemplatedParent }
120-
};
112+
// Workaround for https://github.com/microsoft/microsoft-ui-xaml/issues/2568
113+
if (Owner.QueryIcon is FontIconSource fis &&
114+
fis.ReadLocalValue(FontIconSource.FontSizeProperty) == DependencyProperty.UnsetValue)
115+
{
116+
// This can be expensive, could we optimize?
117+
// Also, this is changing the FontSize on the IconSource (which could be shared?)
118+
fis.FontSize = Owner.TryFindResource("TokenizingTextBoxIconFontSize") as double? ?? 16;
119+
}
121120

122-
var iconSourceElement = new IconSourceElement();
121+
var iconBinding = new Binding()
122+
{
123+
Source = Owner,
124+
Path = new PropertyPath(nameof(Owner.QueryIcon)),
125+
RelativeSource = new RelativeSource() { Mode = RelativeSourceMode.TemplatedParent }
126+
};
123127

124-
iconSourceElement.SetBinding(IconSourceElement.IconSourceProperty, iconBinding);
128+
var iconSourceElement = new IconSourceElement();
125129

126-
_autoSuggestBox.QueryIcon = iconSourceElement;
130+
iconSourceElement.SetBinding(IconSourceElement.IconSourceProperty, iconBinding);
127131

128-
_autoSuggestBox.Text = str.Text;
132+
_autoSuggestBox.QueryIcon = iconSourceElement;
133+
}
129134
}
130135
}
131136
}
@@ -184,19 +189,11 @@ void WaitForLoad(object s, RoutedEventArgs eargs)
184189

185190
private void AutoSuggestBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
186191
{
187-
var hasDelimiter = !string.IsNullOrEmpty(Owner.TokenDelimiter) && sender.Text?.Contains(Owner.TokenDelimiter) == true;
188-
189-
// Ignore in the case we've been set from the parent and already equal the owning text,
190-
// unless we contain our delimiter.
191-
if (!hasDelimiter && EqualityComparer<string>.Default.Equals(sender.Text, Owner.Text))
192+
if (!EqualityComparer<string>.Default.Equals(sender.Text, Owner.Text))
192193
{
193-
return;
194+
Owner.Text = sender.Text; // Update parent text property, if different
194195
}
195196

196-
var t = sender.Text.Trim();
197-
198-
Owner.Text = sender.Text; // Update parent text property
199-
200197
// Override our programmatic manipulation as we're redirecting input for the user
201198
if (UseCharacterAsUser)
202199
{
@@ -207,8 +204,10 @@ private void AutoSuggestBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTex
207204

208205
Owner.RaiseTextChanged(sender, args);
209206

207+
var t = sender.Text?.Trim() ?? string.Empty;
208+
210209
// Look for Token Delimiters to create new tokens when text changes.
211-
if (hasDelimiter)
210+
if (!string.IsNullOrEmpty(Owner.TokenDelimiter) && t.Contains(Owner.TokenDelimiter))
212211
{
213212
bool lastDelimited = t[t.Length - 1] == Owner.TokenDelimiter[0];
214213

0 commit comments

Comments
 (0)