From 234cd9b27699ad49e6d3251ed6d62f1959afb129 Mon Sep 17 00:00:00 2001 From: WMJ Date: Sun, 16 Dec 2018 21:09:10 +0800 Subject: [PATCH] ! Usability enhancement to Navi Bar member filter --- Codist/Controls/MemberFilterBox.cs | 1 + Codist/Controls/ThemedMenuItem.cs | 15 ++++++++++++ Codist/Helpers/WpfHelper.cs | 39 ++++++++++++++++++++++++++++++ Codist/NaviBar/CSharpBar.cs | 5 +++- 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/Codist/Controls/MemberFilterBox.cs b/Codist/Controls/MemberFilterBox.cs index 4b876687..a00e1d1d 100644 --- a/Codist/Controls/MemberFilterBox.cs +++ b/Codist/Controls/MemberFilterBox.cs @@ -102,6 +102,7 @@ void _FilterBox_IsVisibleChanged(object sender, DependencyPropertyChangedEventAr void FilterChanged(object sender, EventArgs e) { Filter(_FilterBox.Text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries), _FilterButtons.Filters); + FocusTextBox(); } void Filter(string[] keywords, MemberFilterTypes filters) { bool useModifierFilter = filters != MemberFilterTypes.All; diff --git a/Codist/Controls/ThemedMenuItem.cs b/Codist/Controls/ThemedMenuItem.cs index 05ecc32c..2a9decf0 100644 --- a/Codist/Controls/ThemedMenuItem.cs +++ b/Codist/Controls/ThemedMenuItem.cs @@ -26,6 +26,17 @@ public object SubMenuHeader { SetValue(SubMenuHeaderProperty, _SubMenuHeader = value); if (_SubMenuHeader != null && HasItems == false) { Items.Add(new MenuItemPlaceHolder()); + (value as FrameworkElement).KeyUp += (s, args) => { + switch (args.Key) { + case System.Windows.Input.Key.Enter: + if (args.OriginalSource is TextBox) { + Items.GetFirst(i => i.IsEnabled && i.IsVisible).PerformClick(); + } + break; + case System.Windows.Input.Key.Down: Items.FocusFirst(); break; + case System.Windows.Input.Key.Up: Items.FocusLast(); break; + } + }; } } } @@ -50,6 +61,10 @@ public void ClearItems() { } } + public void PerformClick() { + OnClick(); + } + internal sealed class MenuItemPlaceHolder : Separator { public MenuItemPlaceHolder() { diff --git a/Codist/Helpers/WpfHelper.cs b/Codist/Helpers/WpfHelper.cs index a3f0739d..4773f76c 100644 --- a/Codist/Helpers/WpfHelper.cs +++ b/Codist/Helpers/WpfHelper.cs @@ -251,6 +251,45 @@ public static TControl ReferenceStyle(this TControl control, object re #endregion #region Others + public static TItem GetFirst(this ItemCollection items, Predicate predicate) + where TItem : FrameworkElement { + foreach (var item in items) { + var i = item as TItem; + if (i != null && (predicate == null || predicate(i))) { + return i; + } + } + return null; + } + public static bool ClickFirstMenuItem(this ItemCollection items) + where TItem : MenuItem { + foreach (var item in items) { + var i = item as TItem; + if (i != null && i.Visibility == Visibility.Visible && i.IsEnabled) { + i.RaiseEvent(new RoutedEventArgs(MenuItem.ClickEvent)); + return true; + } + } + return false; + } + public static bool FocusFirst(this ItemCollection items) + where TItem : FrameworkElement { + foreach (var item in items) { + if ((item as TItem)?.Focus() == true) { + return true; + } + } + return false; + } + public static bool FocusLast(this ItemCollection items) + where TItem : FrameworkElement { + for (int i = items.Count - 1; i >= 0; i--) { + if ((items[i] as TItem)?.Focus() == true) { + return true; + } + } + return false; + } public static TItem Get(this ResourceDictionary items, object key) { return (items != null && items.Contains(key) && items[key] is TItem item) ? item diff --git a/Codist/NaviBar/CSharpBar.cs b/Codist/NaviBar/CSharpBar.cs index 36536d71..0aabf00f 100644 --- a/Codist/NaviBar/CSharpBar.cs +++ b/Codist/NaviBar/CSharpBar.cs @@ -228,6 +228,9 @@ public RootItem(CSharpBar bar) { }; _FinderBox.TextChanged += SearchCriteriaChanged; _ScopeBox.FilterChanged += SearchCriteriaChanged; + _ScopeBox.FilterChanged += (s, args) => { + _FinderBox.Focus(); + }; } void SearchCriteriaChanged(object sender, EventArgs e) { @@ -303,7 +306,7 @@ void ControlMenuSelection(object sender, KeyEventArgs e) { foreach (var item in _Items) { var nav = item as NaviItem; if (nav != null) { - nav.RaiseEvent(new RoutedEventArgs(MenuItem.ClickEvent)); + nav.RaiseEvent(new RoutedEventArgs(ClickEvent)); return; } }