From db79ceed396c85efd506720010ec64e1bfacbbbb Mon Sep 17 00:00:00 2001 From: chinboy Date: Wed, 4 Feb 2026 16:51:08 +0800 Subject: [PATCH] Refactor(Cascader): Add basic key handle support --- .../Cascader/Cascader.cs | 52 +++++++++++++++++++ .../Cascader/CascaderView.cs | 22 ++++++++ .../Select/AbstractSelect.cs | 2 +- 3 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/AtomUI.Desktop.Controls/Cascader/Cascader.cs b/src/AtomUI.Desktop.Controls/Cascader/Cascader.cs index a1e8228ac..b709c468c 100644 --- a/src/AtomUI.Desktop.Controls/Cascader/Cascader.cs +++ b/src/AtomUI.Desktop.Controls/Cascader/Cascader.cs @@ -3,6 +3,7 @@ using System.Reactive.Disposables.Fluent; using AtomUI.Controls; using AtomUI.Desktop.Controls.DataLoad; using AtomUI.Desktop.Controls.Primitives; +using AtomUI.Input; using AtomUI.Theme; using AtomUI.Utils; using Avalonia; @@ -273,6 +274,57 @@ public class Cascader : AbstractSelect, IControlSharedTokenResourcesHost } + protected override void OnKeyDown(KeyEventArgs e) + { + _ = e ?? throw new ArgumentNullException(nameof(e)); + base.OnKeyDown(e); + if (e.Handled || !IsEnabled) + { + return; + } + + if (IsDropDownOpen) + { + if (_cascaderView != null) + { + _cascaderView.HandleKeyDown(e); + if (e.Handled) + { + return; + } + } + + if (e.Key == Key.Escape) + { + SetCurrentValue(IsDropDownOpenProperty, false); + e.Handled = true; + } + } + else + { + // The drop down is not open, the Down key will toggle it open. + // Ignore key buttons, if they are used for XY focus. + if (e.Key == Key.Down + && !this.IsAllowedXYNavigationMode(e.KeyDeviceType)) + { + SetCurrentValue(IsDropDownOpenProperty, true); + e.Handled = true; + } + } + + // Standard drop down navigation + switch (e.Key) + { + case Key.F4: + SetCurrentValue(IsDropDownOpenProperty, !IsDropDownOpen); + e.Handled = true; + break; + + default: + break; + } + } + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { base.OnPropertyChanged(change); diff --git a/src/AtomUI.Desktop.Controls/Cascader/CascaderView.cs b/src/AtomUI.Desktop.Controls/Cascader/CascaderView.cs index b81a3e49f..74c0d780f 100644 --- a/src/AtomUI.Desktop.Controls/Cascader/CascaderView.cs +++ b/src/AtomUI.Desktop.Controls/Cascader/CascaderView.cs @@ -644,4 +644,26 @@ public partial class CascaderView : TemplatedControl, IMotionAwareControl, ICont return false; } + + public void HandleKeyDown(KeyEventArgs e) + { + // TODO + switch (e.Key) + { + case Key.Enter: + e.Handled = false; + break; + + case Key.Up: + e.Handled = false; + break; + + case Key.Down: + e.Handled = false; + break; + + default: + break; + } + } } \ No newline at end of file diff --git a/src/AtomUI.Desktop.Controls/Select/AbstractSelect.cs b/src/AtomUI.Desktop.Controls/Select/AbstractSelect.cs index 154a12879..6daf5dc48 100644 --- a/src/AtomUI.Desktop.Controls/Select/AbstractSelect.cs +++ b/src/AtomUI.Desktop.Controls/Select/AbstractSelect.cs @@ -643,7 +643,7 @@ public class AbstractSelect : TemplatedControl, IMotionAwareControl, ISizeTypeAw private void HandleWindowDeactivated(object? sender, EventArgs e) { - //SetCurrentValue(IsDropDownOpenProperty, false); + SetCurrentValue(IsDropDownOpenProperty, false); } protected override void OnApplyTemplate(TemplateAppliedEventArgs e)