Browse Source

Started putting directional nav back into TreeView.

pull/72/merge
Steven Kirk 11 years ago
parent
commit
37eac44910
  1. 9
      Perspex.Controls/TreeViewItem.cs
  2. 24
      Perspex.Input/KeyboardNavigationHandler.cs
  3. 1
      Perspex.Themes.Default/TreeViewItemStyle.cs

9
Perspex.Controls/TreeViewItem.cs

@ -11,6 +11,7 @@ namespace Perspex.Controls
using Mixins; using Mixins;
using Perspex.Controls.Generators; using Perspex.Controls.Generators;
using Perspex.Controls.Primitives; using Perspex.Controls.Primitives;
using Perspex.Input;
using Perspex.Rendering; using Perspex.Rendering;
using Perspex.VisualTree; using Perspex.VisualTree;
@ -31,6 +32,12 @@ namespace Perspex.Controls
public static readonly PerspexProperty<bool> IsSelectedProperty = public static readonly PerspexProperty<bool> IsSelectedProperty =
ListBoxItem.IsSelectedProperty.AddOwner<TreeViewItem>(); ListBoxItem.IsSelectedProperty.AddOwner<TreeViewItem>();
private static readonly ItemsPanelTemplate DefaultPanel =
new ItemsPanelTemplate(() => new StackPanel
{
[KeyboardNavigation.DirectionalNavigationProperty] = KeyboardNavigationMode.Continue,
});
private TreeView treeView; private TreeView treeView;
/// <summary> /// <summary>
@ -39,6 +46,8 @@ namespace Perspex.Controls
static TreeViewItem() static TreeViewItem()
{ {
SelectableMixin.Attach<TreeViewItem>(IsSelectedProperty); SelectableMixin.Attach<TreeViewItem>(IsSelectedProperty);
FocusableProperty.OverrideDefaultValue<TreeViewItem>(true);
ItemsPanelProperty.OverrideDefaultValue<TreeViewItem>(DefaultPanel);
} }
/// <summary> /// <summary>

24
Perspex.Input/KeyboardNavigationHandler.cs

@ -84,7 +84,7 @@ namespace Perspex.Input
GetFirstInNextContainer(element, forward); GetFirstInNextContainer(element, forward);
case KeyboardNavigationMode.Cycle: case KeyboardNavigationMode.Cycle:
return GetNextInContainer(element, container, direction) ?? return GetNextInContainer(element, container, direction) ??
GetDescendent(container, forward); GetFocusableDescendent(container, forward);
case KeyboardNavigationMode.Contained: case KeyboardNavigationMode.Contained:
return GetNextInContainer(element, container, direction); return GetNextInContainer(element, container, direction);
default: default:
@ -93,7 +93,7 @@ namespace Perspex.Input
} }
else else
{ {
return GetDescendents(element).FirstOrDefault(); return GetFocusableDescendents(element).FirstOrDefault();
} }
} }
@ -134,11 +134,11 @@ namespace Perspex.Input
/// <param name="container">The element.</param> /// <param name="container">The element.</param>
/// <param name="forward">Whether to search forward or backwards.</param> /// <param name="forward">Whether to search forward or backwards.</param>
/// <returns>The element or null if not found.##</returns> /// <returns>The element or null if not found.##</returns>
private static IInputElement GetDescendent(IInputElement container, bool forward) private static IInputElement GetFocusableDescendent(IInputElement container, bool forward)
{ {
return forward ? return forward ?
GetDescendents(container).FirstOrDefault() : GetFocusableDescendents(container).FirstOrDefault() :
GetDescendents(container).LastOrDefault(); GetFocusableDescendents(container).LastOrDefault();
} }
/// <summary> /// <summary>
@ -147,7 +147,7 @@ namespace Perspex.Input
/// </summary> /// </summary>
/// <param name="element">The element.</param> /// <param name="element">The element.</param>
/// <returns>The element's focusable descendents.</returns> /// <returns>The element's focusable descendents.</returns>
private static IEnumerable<IInputElement> GetDescendents(IInputElement element) private static IEnumerable<IInputElement> GetFocusableDescendents(IInputElement element)
{ {
var mode = KeyboardNavigation.GetTabNavigation((InputElement)element); var mode = KeyboardNavigation.GetTabNavigation((InputElement)element);
@ -182,7 +182,7 @@ namespace Perspex.Input
if (CanFocusDescendent(child)) if (CanFocusDescendent(child))
{ {
foreach (var descendent in GetDescendents(child)) foreach (var descendent in GetFocusableDescendents(child))
{ {
yield return descendent; yield return descendent;
} }
@ -202,7 +202,7 @@ namespace Perspex.Input
IInputElement container, IInputElement container,
FocusNavigationDirection direction) FocusNavigationDirection direction)
{ {
var descendent = GetDescendents(element).FirstOrDefault(); var descendent = GetFocusableDescendents(element).FirstOrDefault();
if (descendent != null) if (descendent != null)
{ {
@ -268,8 +268,8 @@ namespace Perspex.Input
else else
{ {
next = forward ? next = forward ?
GetDescendents(sibling).FirstOrDefault() : GetFocusableDescendents(sibling).FirstOrDefault() :
GetDescendents(sibling).LastOrDefault(); GetFocusableDescendents(sibling).LastOrDefault();
} }
} }
@ -281,8 +281,8 @@ namespace Perspex.Input
else else
{ {
next = forward ? next = forward ?
GetDescendents(container).FirstOrDefault() : GetFocusableDescendents(container).FirstOrDefault() :
GetDescendents(container).LastOrDefault(); GetFocusableDescendents(container).LastOrDefault();
} }
return next; return next;

1
Perspex.Themes.Default/TreeViewItemStyle.cs

@ -86,6 +86,7 @@ namespace Perspex.Themes.Default
new ToggleButton new ToggleButton
{ {
Classes = new Classes("expander"), Classes = new Classes("expander"),
Focusable = false,
[~~ToggleButton.IsCheckedProperty] = control[~TreeViewItem.IsExpandedProperty], [~~ToggleButton.IsCheckedProperty] = control[~TreeViewItem.IsExpandedProperty],
}, },
new Border new Border

Loading…
Cancel
Save