feat: improve accessibility.

This commit is contained in:
rabbitism
2025-09-16 20:06:03 +08:00
parent 0173ee7c9c
commit d40c2c5c90
3 changed files with 19 additions and 10 deletions

View File

@@ -37,7 +37,7 @@
<ItemsPanelTemplate> <ItemsPanelTemplate>
<u:WrapPanelWithTrailingItem> <u:WrapPanelWithTrailingItem>
<u:WrapPanelWithTrailingItem.TrailingItem> <u:WrapPanelWithTrailingItem.TrailingItem>
<TextBox VerticalAlignment="Center" Theme="{DynamicResource TagInputTextBoxTheme}"/> <TextBox VerticalAlignment="Center" MinWidth="24" Theme="{DynamicResource TagInputTextBoxTheme}"/>
</u:WrapPanelWithTrailingItem.TrailingItem> </u:WrapPanelWithTrailingItem.TrailingItem>
</u:WrapPanelWithTrailingItem> </u:WrapPanelWithTrailingItem>
</ItemsPanelTemplate> </ItemsPanelTemplate>

View File

@@ -637,6 +637,11 @@ public partial class MultiAutoCompleteBox : TemplatedControl, IInnerContentContr
if (e.Key == Key.Down if (e.Key == Key.Down
&& !this.IsAllowedXYNavigationMode(e.KeyDeviceType)) && !this.IsAllowedXYNavigationMode(e.KeyDeviceType))
{ {
if (string.IsNullOrEmpty(TextBox?.Text))
{
UpdateTextValue(string.Empty, true);
}
RefreshView();
SetCurrentValue(IsDropDownOpenProperty, true); SetCurrentValue(IsDropDownOpenProperty, true);
e.Handled = true; e.Handled = true;
} }
@@ -1101,7 +1106,7 @@ public partial class MultiAutoCompleteBox : TemplatedControl, IInnerContentContr
{ {
if (_popupHasOpened) if (_popupHasOpened)
{ {
if (SelectionAdapter != null) SelectionAdapter.SelectedItem = null; // if (SelectionAdapter != null) SelectionAdapter.SelectedItem = null;
if (DropDownPopup != null) DropDownPopup.IsOpen = false; if (DropDownPopup != null) DropDownPopup.IsOpen = false;
OnDropDownClosed(System.EventArgs.Empty); OnDropDownClosed(System.EventArgs.Empty);
} }
@@ -1564,7 +1569,10 @@ public partial class MultiAutoCompleteBox : TemplatedControl, IInnerContentContr
/// <param name="e">The selection changed event data.</param> /// <param name="e">The selection changed event data.</param>
private void OnAdapterSelectionChanged(object? sender, SelectionChangedEventArgs e) private void OnAdapterSelectionChanged(object? sender, SelectionChangedEventArgs e)
{ {
SelectedItems?.Add(_adapter?.SelectedItem); if (_valueBindingEvaluator is null) return;
UpdateTextValue(_valueBindingEvaluator?.GetDynamicValue(_adapter?.SelectedItem), false);
// SelectedItems?.Add(_adapter?.SelectedItem);
} }
//TODO Check UpdateTextCompletion //TODO Check UpdateTextCompletion
@@ -1579,6 +1587,7 @@ public partial class MultiAutoCompleteBox : TemplatedControl, IInnerContentContr
// Completion will update the selected value // Completion will update the selected value
//UpdateTextCompletion(false); //UpdateTextCompletion(false);
SelectedItems?.Add(_adapter?.SelectedItem);
UpdateTextValue(string.Empty, false); UpdateTextValue(string.Empty, false);
// Text should not be selected // Text should not be selected

View File

@@ -1,4 +1,5 @@
using System.Collections; using System.Collections;
using System.Diagnostics;
using Avalonia; using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
@@ -16,9 +17,6 @@ public class MultiAutoCompleteSelectionAdapter : ISelectionAdapter
/// </summary> /// </summary>
private SelectingItemsControl? _selector; private SelectingItemsControl? _selector;
private object? _previewSelectedItem;
private object? _selectedItem;
/// <summary> /// <summary>
/// Initializes a new instance of the /// Initializes a new instance of the
/// <see cref="T:Avalonia.Controls.Utils.SelectingItemsControlSelectionAdapter" /> /// <see cref="T:Avalonia.Controls.Utils.SelectingItemsControlSelectionAdapter" />
@@ -110,14 +108,13 @@ public class MultiAutoCompleteSelectionAdapter : ISelectionAdapter
/// <value>The selected item of the underlying selection adapter.</value> /// <value>The selected item of the underlying selection adapter.</value>
public object? SelectedItem public object? SelectedItem
{ {
get => _selectedItem; get => SelectorControl?.SelectedItem;
set set
{ {
IgnoringSelectionChanged = true; IgnoringSelectionChanged = true;
if (SelectorControl != null) if (SelectorControl != null)
{ {
_selectedItem = value;
SelectorControl.SelectedItem = value; SelectorControl.SelectedItem = value;
} }
// Attempt to reset the scroll viewer's position // Attempt to reset the scroll viewer's position
@@ -215,7 +212,9 @@ public class MultiAutoCompleteSelectionAdapter : ISelectionAdapter
private void OnSelectionChanged(object? sender, SelectionChangedEventArgs e) private void OnSelectionChanged(object? sender, SelectionChangedEventArgs e)
{ {
if (IgnoringSelectionChanged) return; if (IgnoringSelectionChanged) return;
_previewSelectedItem = SelectorControl?.SelectedItem; // SelectedItem = SelectorControl?.SelectedItem;
SelectionChanged?.Invoke(this, e);
// _previewSelectedItem = SelectorControl?.SelectedItem;
} }
/// <summary> /// <summary>
@@ -258,6 +257,7 @@ public class MultiAutoCompleteSelectionAdapter : ISelectionAdapter
/// </summary> /// </summary>
internal void OnCommit() internal void OnCommit()
{ {
/*
if (_previewSelectedItem is null) return; if (_previewSelectedItem is null) return;
SelectedItem = _previewSelectedItem; SelectedItem = _previewSelectedItem;
SelectionChanged?.Invoke(this, SelectionChanged?.Invoke(this,
@@ -267,6 +267,7 @@ public class MultiAutoCompleteSelectionAdapter : ISelectionAdapter
new List<object?> { SelectedItem } new List<object?> { SelectedItem }
) )
); );
*/
Commit?.Invoke(this, new RoutedEventArgs()); Commit?.Invoke(this, new RoutedEventArgs());
AfterAdapterAction(); AfterAdapterAction();
} }
@@ -292,7 +293,6 @@ public class MultiAutoCompleteSelectionAdapter : ISelectionAdapter
{ {
SelectorControl.SelectedItem = null; SelectorControl.SelectedItem = null;
SelectorControl.SelectedIndex = -1; SelectorControl.SelectedIndex = -1;
_previewSelectedItem = null;
} }
IgnoringSelectionChanged = false; IgnoringSelectionChanged = false;
} }