feat: cleanup code. add missing template parts.

This commit is contained in:
rabbitism
2025-09-15 10:00:48 +08:00
parent 214f86bb82
commit 1a9f2e9945

View File

@@ -10,6 +10,7 @@ using System.Collections;
using Avalonia; using Avalonia;
using Avalonia.Collections; using Avalonia.Collections;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Controls.Metadata;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Controls.Utils; using Avalonia.Controls.Utils;
@@ -24,6 +25,11 @@ using Ursa.Common;
namespace Ursa.Controls; namespace Ursa.Controls;
[TemplatePart(ElementPopup, typeof(Popup))]
[TemplatePart(ElementSelector, typeof(SelectingItemsControl))]
[TemplatePart(ElementSelectionAdapter, typeof(ISelectionAdapter))]
[TemplatePart(ElementTextBox, typeof(TextBox))]
[PseudoClasses(":dropdownopen")]
public partial class MultiAutoCompleteBox : TemplatedControl, IInnerContentControl public partial class MultiAutoCompleteBox : TemplatedControl, IInnerContentControl
{ {
/// <summary> /// <summary>
@@ -176,18 +182,15 @@ public partial class MultiAutoCompleteBox : TemplatedControl, IInnerContentContr
{ {
FocusableProperty.OverrideDefaultValue<MultiAutoCompleteBox>(true); FocusableProperty.OverrideDefaultValue<MultiAutoCompleteBox>(true);
IsTabStopProperty.OverrideDefaultValue<MultiAutoCompleteBox>(false); IsTabStopProperty.OverrideDefaultValue<MultiAutoCompleteBox>(false);
MinimumPopulateDelayProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((box, args) => box.OnMinimumPopulateDelayChanged(args));
MinimumPopulateDelayProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((x, e) => IsDropDownOpenProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((box, args)=> box.OnIsDropDownOpenChanged(args));
x.OnMinimumPopulateDelayChanged(e)); TextProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((box, args) => box.OnTextPropertyChanged(args));
IsDropDownOpenProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((x, e) => x.OnIsDropDownOpenChanged(e)); SearchTextProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((box, args) => box.OnSearchTextPropertyChanged(args));
// SelectedItemProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((x, e) => x.OnSelectedItemPropertyChanged(e)); FilterModeProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((box, args)=> box.OnFilterModePropertyChanged(args));
TextProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((x, e) => x.OnTextPropertyChanged(e)); ItemFilterProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((box, args) => box.OnItemFilterPropertyChanged(args));
SearchTextProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((x, e) => x.OnSearchTextPropertyChanged(e)); ItemsSourceProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((box, args) => box.OnItemsSourcePropertyChanged(args));
FilterModeProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((x, e) => x.OnFilterModePropertyChanged(e)); ItemTemplateProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((box, args) => box.OnItemTemplatePropertyChanged(args));
ItemFilterProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((x, e) => x.OnItemFilterPropertyChanged(e)); IsEnabledProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((box, args) => box.OnControlIsEnabledChanged(args));
ItemsSourceProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((x, e) => x.OnItemsSourcePropertyChanged(e));
ItemTemplateProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((x, e) => x.OnItemTemplatePropertyChanged(e));
IsEnabledProperty.Changed.AddClassHandler<MultiAutoCompleteBox>((x, e) => x.OnControlIsEnabledChanged(e));
} }
/// <summary> /// <summary>
@@ -233,7 +236,7 @@ public partial class MultiAutoCompleteBox : TemplatedControl, IInnerContentContr
private void OnTextBoxKeyDown(object sender, KeyEventArgs e) private void OnTextBoxKeyDown(object sender, KeyEventArgs e)
{ {
if ((e.Key == Key.Back || e.Key == Key.Delete )&& string.IsNullOrEmpty(TextBox?.Text) ) if (e.Key is Key.Back or Key.Delete && string.IsNullOrEmpty(TextBox?.Text))
{ {
if (SelectedItems?.Count > 0) if (SelectedItems?.Count > 0)
{ {
@@ -275,7 +278,7 @@ public partial class MultiAutoCompleteBox : TemplatedControl, IInnerContentContr
/// use with AutoCompleteBox or deriving from AutoCompleteBox to /// use with AutoCompleteBox or deriving from AutoCompleteBox to
/// create a custom control. /// create a custom control.
/// </remarks> /// </remarks>
protected ISelectionAdapter? SelectionAdapter private ISelectionAdapter? SelectionAdapter
{ {
get => _adapter; get => _adapter;
set set
@@ -566,9 +569,12 @@ public partial class MultiAutoCompleteBox : TemplatedControl, IInnerContentContr
public const string PART_SelectedItemsControl = "PART_SelectedItemsControl"; public const string PART_SelectedItemsControl = "PART_SelectedItemsControl";
private ItemsControl? _selectedItemsControl; private ItemsControl? _selectedItemsControl;
/// <inheritdoc />
protected override void OnLoaded(RoutedEventArgs e) protected override void OnLoaded(RoutedEventArgs e)
{ {
base.OnLoaded(e); base.OnLoaded(e);
// TextBox can only be securely initialized after
TextBox = (_selectedItemsControl?.ItemsPanelRoot as WrapPanelWithTrailingItem)?.TrailingItem as TextBox; TextBox = (_selectedItemsControl?.ItemsPanelRoot as WrapPanelWithTrailingItem)?.TrailingItem as TextBox;
} }
@@ -1614,11 +1620,11 @@ public partial class MultiAutoCompleteBox : TemplatedControl, IInnerContentContr
/// Index function that retrieves the filter for the provided /// Index function that retrieves the filter for the provided
/// AutoCompleteFilterMode. /// AutoCompleteFilterMode.
/// </summary> /// </summary>
/// <param name="FilterMode">The built-in search mode.</param> /// <param name="filterMode">The built-in search mode.</param>
/// <returns>Returns the string-based comparison function.</returns> /// <returns>Returns the string-based comparison function.</returns>
public static AutoCompleteFilterPredicate<string?>? GetFilter(AutoCompleteFilterMode FilterMode) public static AutoCompleteFilterPredicate<string?>? GetFilter(AutoCompleteFilterMode filterMode)
{ {
switch (FilterMode) switch (filterMode)
{ {
case AutoCompleteFilterMode.Contains: case AutoCompleteFilterMode.Contains:
return Contains; return Contains;