From 2ebd2b28a8101a9a66dbcc7c69ef3e214c3d32e9 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 18 Nov 2025 16:54:42 +0800 Subject: [PATCH] Support Backspace for remove actions in UI lists Changed key handling and menu input gestures to allow Backspace (in addition to Delete) for removing items in server, profile, and routing rule lists. This improves usability and consistency across both Avalonia and WPF views. --- .../Views/AddGroupServerWindow.axaml | 5 +- .../Views/AddGroupServerWindow.axaml.cs | 1 + .../v2rayN.Desktop/Views/ProfilesView.axaml | 2 +- .../Views/ProfilesView.axaml.cs | 56 ++++++++++--------- .../Views/RoutingRuleSettingWindow.axaml | 2 +- .../Views/RoutingRuleSettingWindow.axaml.cs | 39 +++++++------ .../Views/RoutingSettingWindow.axaml | 2 +- .../Views/RoutingSettingWindow.axaml.cs | 25 ++++++--- .../v2rayN/Views/AddGroupServerWindow.xaml.cs | 39 +++++++------ v2rayN/v2rayN/Views/ProfilesView.xaml | 2 +- v2rayN/v2rayN/Views/ProfilesView.xaml.cs | 56 ++++++++++--------- .../Views/RoutingRuleSettingWindow.xaml | 2 +- .../Views/RoutingRuleSettingWindow.xaml.cs | 39 +++++++------ v2rayN/v2rayN/Views/RoutingSettingWindow.xaml | 2 +- .../v2rayN/Views/RoutingSettingWindow.xaml.cs | 25 ++++++--- 15 files changed, 168 insertions(+), 129 deletions(-) diff --git a/v2rayN/v2rayN.Desktop/Views/AddGroupServerWindow.axaml b/v2rayN/v2rayN.Desktop/Views/AddGroupServerWindow.axaml index 81e4c6aa..221a1b88 100644 --- a/v2rayN/v2rayN.Desktop/Views/AddGroupServerWindow.axaml +++ b/v2rayN/v2rayN.Desktop/Views/AddGroupServerWindow.axaml @@ -152,7 +152,10 @@ - + break; case Key.Delete: + case Key.Back: ViewModel?.ChildRemoveAsync(); e.Handled = true; break; diff --git a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml index 371ade2d..c84a7151 100644 --- a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml +++ b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml @@ -115,7 +115,7 @@ + InputGesture="Back" /> diff --git a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs index 418d6d20..e019c5fd 100644 --- a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs @@ -313,33 +313,37 @@ public partial class ProfilesView : ReactiveUserControl } else { - if (e.Key is Key.Enter or Key.Return) + switch (e.Key) { - ViewModel?.SetDefaultServer(); - } - else if (e.Key == Key.Delete) - { - ViewModel?.RemoveServerAsync(); - } - else if (e.Key == Key.T) - { - ViewModel?.MoveServer(EMove.Top); - } - else if (e.Key == Key.U) - { - ViewModel?.MoveServer(EMove.Up); - } - else if (e.Key == Key.D) - { - ViewModel?.MoveServer(EMove.Down); - } - else if (e.Key == Key.B) - { - ViewModel?.MoveServer(EMove.Bottom); - } - else if (e.Key == Key.Escape) - { - ViewModel?.ServerSpeedtestStop(); + case Key.Enter: + //case Key.Return: + ViewModel?.SetDefaultServer(); + break; + + case Key.Delete: + case Key.Back: + ViewModel?.RemoveServerAsync(); + break; + + case Key.T: + ViewModel?.MoveServer(EMove.Top); + break; + + case Key.U: + ViewModel?.MoveServer(EMove.Up); + break; + + case Key.D: + ViewModel?.MoveServer(EMove.Down); + break; + + case Key.B: + ViewModel?.MoveServer(EMove.Bottom); + break; + + case Key.Escape: + ViewModel?.ServerSpeedtestStop(); + break; } } } diff --git a/v2rayN/v2rayN.Desktop/Views/RoutingRuleSettingWindow.axaml b/v2rayN/v2rayN.Desktop/Views/RoutingRuleSettingWindow.axaml index 8c84bc39..7d00b3cc 100644 --- a/v2rayN/v2rayN.Desktop/Views/RoutingRuleSettingWindow.axaml +++ b/v2rayN/v2rayN.Desktop/Views/RoutingRuleSettingWindow.axaml @@ -187,7 +187,7 @@ + InputGesture="Back" /> + InputGesture="Back" /> { if (e.KeyModifiers is KeyModifiers.Control or KeyModifiers.Meta) { - if (e.Key == Key.A) + switch (e.Key) { - lstRoutings.SelectAll(); + case Key.A: + lstRoutings.SelectAll(); + break; } } - else if (e.Key is Key.Enter or Key.Return) + else { - ViewModel?.RoutingAdvancedSetDefault(); - } - else if (e.Key == Key.Delete) - { - ViewModel?.RoutingAdvancedRemoveAsync(); + switch (e.Key) + { + case Key.Enter: + //case Key.Return: + ViewModel?.RoutingAdvancedSetDefault(); + break; + + case Key.Delete: + case Key.Back: + ViewModel?.RoutingAdvancedRemoveAsync(); + break; + } } } diff --git a/v2rayN/v2rayN/Views/AddGroupServerWindow.xaml.cs b/v2rayN/v2rayN/Views/AddGroupServerWindow.xaml.cs index d7cf450c..14f5a7bf 100644 --- a/v2rayN/v2rayN/Views/AddGroupServerWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/AddGroupServerWindow.xaml.cs @@ -91,25 +91,28 @@ public partial class AddGroupServerWindow } else { - if (e.Key == Key.T) + switch (e.Key) { - ViewModel?.MoveServer(EMove.Top); - } - else if (e.Key == Key.U) - { - ViewModel?.MoveServer(EMove.Up); - } - else if (e.Key == Key.D) - { - ViewModel?.MoveServer(EMove.Down); - } - else if (e.Key == Key.B) - { - ViewModel?.MoveServer(EMove.Bottom); - } - else if (e.Key == Key.Delete) - { - ViewModel?.ChildRemoveAsync(); + case Key.T: + ViewModel?.MoveServer(EMove.Top); + break; + + case Key.U: + ViewModel?.MoveServer(EMove.Up); + break; + + case Key.D: + ViewModel?.MoveServer(EMove.Down); + break; + + case Key.B: + ViewModel?.MoveServer(EMove.Bottom); + break; + + case Key.Delete: + case Key.Back: + ViewModel?.ChildRemoveAsync(); + break; } } } diff --git a/v2rayN/v2rayN/Views/ProfilesView.xaml b/v2rayN/v2rayN/Views/ProfilesView.xaml index 8bbfb6b7..6cf0d159 100644 --- a/v2rayN/v2rayN/Views/ProfilesView.xaml +++ b/v2rayN/v2rayN/Views/ProfilesView.xaml @@ -138,7 +138,7 @@ x:Name="menuRemoveServer" Height="{StaticResource MenuItemHeight}" Header="{x:Static resx:ResUI.menuRemoveServer}" - InputGestureText="Delete" /> + InputGestureText="Back" /> + InputGestureText="Back" /> + InputGestureText="Back" />