diff --git a/Perspex.Controls/TreeViewItem.cs b/Perspex.Controls/TreeViewItem.cs index 0f43ef60fe..031e9d697e 100644 --- a/Perspex.Controls/TreeViewItem.cs +++ b/Perspex.Controls/TreeViewItem.cs @@ -11,6 +11,7 @@ namespace Perspex.Controls using Mixins; using Perspex.Controls.Generators; using Perspex.Controls.Primitives; + using Perspex.Input; using Perspex.Rendering; using Perspex.VisualTree; @@ -31,6 +32,12 @@ namespace Perspex.Controls public static readonly PerspexProperty IsSelectedProperty = ListBoxItem.IsSelectedProperty.AddOwner(); + private static readonly ItemsPanelTemplate DefaultPanel = + new ItemsPanelTemplate(() => new StackPanel + { + [KeyboardNavigation.DirectionalNavigationProperty] = KeyboardNavigationMode.Continue, + }); + private TreeView treeView; /// @@ -39,6 +46,8 @@ namespace Perspex.Controls static TreeViewItem() { SelectableMixin.Attach(IsSelectedProperty); + FocusableProperty.OverrideDefaultValue(true); + ItemsPanelProperty.OverrideDefaultValue(DefaultPanel); } /// diff --git a/Perspex.Input/KeyboardNavigationHandler.cs b/Perspex.Input/KeyboardNavigationHandler.cs index b9a5e76655..718e1bcca2 100644 --- a/Perspex.Input/KeyboardNavigationHandler.cs +++ b/Perspex.Input/KeyboardNavigationHandler.cs @@ -84,7 +84,7 @@ namespace Perspex.Input GetFirstInNextContainer(element, forward); case KeyboardNavigationMode.Cycle: return GetNextInContainer(element, container, direction) ?? - GetDescendent(container, forward); + GetFocusableDescendent(container, forward); case KeyboardNavigationMode.Contained: return GetNextInContainer(element, container, direction); default: @@ -93,7 +93,7 @@ namespace Perspex.Input } else { - return GetDescendents(element).FirstOrDefault(); + return GetFocusableDescendents(element).FirstOrDefault(); } } @@ -134,11 +134,11 @@ namespace Perspex.Input /// The element. /// Whether to search forward or backwards. /// The element or null if not found.## - private static IInputElement GetDescendent(IInputElement container, bool forward) + private static IInputElement GetFocusableDescendent(IInputElement container, bool forward) { return forward ? - GetDescendents(container).FirstOrDefault() : - GetDescendents(container).LastOrDefault(); + GetFocusableDescendents(container).FirstOrDefault() : + GetFocusableDescendents(container).LastOrDefault(); } /// @@ -147,7 +147,7 @@ namespace Perspex.Input /// /// The element. /// The element's focusable descendents. - private static IEnumerable GetDescendents(IInputElement element) + private static IEnumerable GetFocusableDescendents(IInputElement element) { var mode = KeyboardNavigation.GetTabNavigation((InputElement)element); @@ -182,7 +182,7 @@ namespace Perspex.Input if (CanFocusDescendent(child)) { - foreach (var descendent in GetDescendents(child)) + foreach (var descendent in GetFocusableDescendents(child)) { yield return descendent; } @@ -202,7 +202,7 @@ namespace Perspex.Input IInputElement container, FocusNavigationDirection direction) { - var descendent = GetDescendents(element).FirstOrDefault(); + var descendent = GetFocusableDescendents(element).FirstOrDefault(); if (descendent != null) { @@ -268,8 +268,8 @@ namespace Perspex.Input else { next = forward ? - GetDescendents(sibling).FirstOrDefault() : - GetDescendents(sibling).LastOrDefault(); + GetFocusableDescendents(sibling).FirstOrDefault() : + GetFocusableDescendents(sibling).LastOrDefault(); } } @@ -281,8 +281,8 @@ namespace Perspex.Input else { next = forward ? - GetDescendents(container).FirstOrDefault() : - GetDescendents(container).LastOrDefault(); + GetFocusableDescendents(container).FirstOrDefault() : + GetFocusableDescendents(container).LastOrDefault(); } return next; diff --git a/Perspex.Themes.Default/TreeViewItemStyle.cs b/Perspex.Themes.Default/TreeViewItemStyle.cs index b2db80f24e..cd41687c71 100644 --- a/Perspex.Themes.Default/TreeViewItemStyle.cs +++ b/Perspex.Themes.Default/TreeViewItemStyle.cs @@ -86,6 +86,7 @@ namespace Perspex.Themes.Default new ToggleButton { Classes = new Classes("expander"), + Focusable = false, [~~ToggleButton.IsCheckedProperty] = control[~TreeViewItem.IsExpandedProperty], }, new Border