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

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

@ -621,6 +621,26 @@ namespace Perspex.Input.UnitTests
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]
public void Up_Cycle_Returns_Up_Control_In_Container()
{
@ -777,7 +797,7 @@ namespace Perspex.Input.UnitTests
}
[Fact]
public void Up_Contained_Doesnt_Select_Child_Control()
public void Up_Contained_Doesnt_Return_Child_Control()
{
Decorator current;

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

@ -758,6 +758,25 @@ namespace Perspex.Input.UnitTests
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]
public void Previous_Cycle_Returns_Previous_Control_In_Container()
{

Loading…
Cancel
Save