Browse Source

Fixed navigation (I think).

pull/72/merge
Steven Kirk 11 years ago
parent
commit
dbae7b0aa2
  1. 13
      Perspex.Input/Navigation/DirectionalNavigation.cs
  2. 11
      Perspex.Input/Navigation/TabNavigation.cs
  3. 22
      Tests/Perspex.Input.UnitTests/KeyboardNavigationTests_Arrows.cs
  4. 19
      Tests/Perspex.Input.UnitTests/KeyboardNavigationTests_Tab.cs

13
Perspex.Input/Navigation/DirectionalNavigation.cs

@ -140,8 +140,6 @@ namespace Perspex.Input.Navigation
{ {
var navigable = container as INavigableContainer; var navigable = container as INavigableContainer;
// TODO: Do a spatial search here if the container doesn't implement
// INavigableContainer.
if (navigable != null) if (navigable != null)
{ {
while (element != null) while (element != null)
@ -154,6 +152,12 @@ namespace Perspex.Input.Navigation
} }
} }
} }
else
{
// TODO: Do a spatial search here if the container doesn't implement
// INavigableContainer.
element = null;
}
if (element != null && direction == FocusNavigationDirection.Up) if (element != null && direction == FocusNavigationDirection.Up)
{ {
@ -187,6 +191,11 @@ namespace Perspex.Input.Navigation
if (parent != null) if (parent != null)
{ {
if (!isForward && parent.CanFocus())
{
return parent;
}
var siblings = parent.GetVisualChildren() var siblings = parent.GetVisualChildren()
.OfType<IInputElement>() .OfType<IInputElement>()
.Where(FocusExtensions.CanFocusDescendents); .Where(FocusExtensions.CanFocusDescendents);

11
Perspex.Input/Navigation/TabNavigation.cs

@ -161,6 +161,12 @@ namespace Perspex.Input.Navigation
} }
} }
} }
else
{
// TODO: Do a spatial search here if the container doesn't implement
// INavigableContainer.
element = null;
}
if (element != null && direction == FocusNavigationDirection.Previous) if (element != null && direction == FocusNavigationDirection.Previous)
{ {
@ -193,6 +199,11 @@ namespace Perspex.Input.Navigation
if (parent != null) if (parent != null)
{ {
if (direction == FocusNavigationDirection.Previous && parent.CanFocus())
{
return parent;
}
var siblings = parent.GetVisualChildren() var siblings = parent.GetVisualChildren()
.OfType<IInputElement>() .OfType<IInputElement>()
.Where(FocusExtensions.CanFocusDescendents); .Where(FocusExtensions.CanFocusDescendents);

22
Tests/Perspex.Input.UnitTests/KeyboardNavigationTests_Arrows.cs

@ -621,6 +621,26 @@ namespace Perspex.Input.UnitTests
Assert.Equal(next, result); Assert.Equal(next, result);
} }
[Fact]
public void Up_Continue_Returns_Parent()
{
Button current;
var top = new Decorator
{
Focusable = true,
[KeyboardNavigation.DirectionalNavigationProperty] = KeyboardNavigationMode.Continue,
Child = current = new Button
{
Name = "Button",
}
};
var result = KeyboardNavigationHandler.GetNext(current, FocusNavigationDirection.Up);
Assert.Equal(top, result);
}
[Fact] [Fact]
public void Up_Cycle_Returns_Up_Control_In_Container() public void Up_Cycle_Returns_Up_Control_In_Container()
{ {
@ -777,7 +797,7 @@ namespace Perspex.Input.UnitTests
} }
[Fact] [Fact]
public void Up_Contained_Doesnt_Select_Child_Control() public void Up_Contained_Doesnt_Return_Child_Control()
{ {
Decorator current; Decorator current;

19
Tests/Perspex.Input.UnitTests/KeyboardNavigationTests_Tab.cs

@ -758,6 +758,25 @@ namespace Perspex.Input.UnitTests
Assert.Equal(next, result); Assert.Equal(next, result);
} }
[Fact]
public void Previous_Continue_Returns_Parent()
{
Button current;
var top = new Decorator
{
Focusable = true,
Child = current = new Button
{
Name = "Button",
}
};
var result = KeyboardNavigationHandler.GetNext(current, FocusNavigationDirection.Previous);
Assert.Equal(top, result);
}
[Fact] [Fact]
public void Previous_Cycle_Returns_Previous_Control_In_Container() public void Previous_Cycle_Returns_Previous_Control_In_Container()
{ {

Loading…
Cancel
Save