Browse Source

Make keyboard navigation handler per-window.

Use the same pattern as AccessKeyHander.
pull/58/head
Steven Kirk 11 years ago
parent
commit
05f131595c
  1. 4
      Perspex.Application/Application.cs
  2. 19
      Perspex.Controls/TopLevel.cs
  3. 8
      Perspex.Input/AccessKeyHandler.cs
  4. 5
      Perspex.Input/IInputRoot.cs
  5. 21
      Perspex.Input/IKeyboardNavigation.cs
  6. 35
      Perspex.Input/IKeyboardNavigationHandler.cs
  7. 15
      Perspex.Input/InputElement.cs
  8. 303
      Perspex.Input/KeyboardNavigation.cs
  9. 362
      Perspex.Input/KeyboardNavigationHandler.cs
  10. 3
      Perspex.Input/Perspex.Input.csproj
  11. 44
      Tests/Perspex.Input.UnitTests/KeyboardNavigationTests.cs

4
Perspex.Application/Application.cs

@ -151,8 +151,6 @@ namespace Perspex
/// </summary>
protected virtual void RegisterServices()
{
var keyboardNavigation = new KeyboardNavigation();
this.FocusManager = new FocusManager();
this.InputManager = new InputManager();
@ -161,7 +159,7 @@ namespace Perspex
Locator.CurrentMutable.Register(() => this, typeof(IGlobalStyles));
Locator.CurrentMutable.Register(() => this.FocusManager, typeof(IFocusManager));
Locator.CurrentMutable.Register(() => this.InputManager, typeof(IInputManager));
Locator.CurrentMutable.Register(() => keyboardNavigation, typeof(IKeyboardNavigation));
Locator.CurrentMutable.Register(() => new KeyboardNavigationHandler(), typeof(IKeyboardNavigationHandler));
Locator.CurrentMutable.Register(() => this.styler, typeof(IStyler));
Locator.CurrentMutable.Register(() => new LayoutManager(), typeof(ILayoutManager));
Locator.CurrentMutable.Register(() => new RenderManager(), typeof(IRenderManager));

19
Perspex.Controls/TopLevel.cs

@ -67,6 +67,11 @@ namespace Perspex.Controls
/// </summary>
private IAccessKeyHandler accessKeyHandler;
/// <summary>
/// The access keyboard navigation handler for the window.
/// </summary>
private IKeyboardNavigationHandler keyboardNavigationHandler;
/// <summary>
/// Whether an auto-size operation is in progress.
/// </summary>
@ -91,6 +96,7 @@ namespace Perspex.Controls
this.PlatformImpl = impl;
this.accessKeyHandler = Locator.Current.GetService<IAccessKeyHandler>();
this.inputManager = Locator.Current.GetService<IInputManager>();
this.keyboardNavigationHandler = Locator.Current.GetService<IKeyboardNavigationHandler>();
this.LayoutManager = Locator.Current.GetService<ILayoutManager>();
this.renderManager = Locator.Current.GetService<IRenderManager>();
@ -129,6 +135,11 @@ namespace Perspex.Controls
this.accessKeyHandler.SetOwner(this);
}
if (this.keyboardNavigationHandler != null)
{
this.keyboardNavigationHandler.SetOwner(this);
}
this.PlatformImpl.SetOwner(this);
this.PlatformImpl.Activated = this.HandleActivated;
this.PlatformImpl.Deactivated = this.HandleDeactivated;
@ -227,6 +238,14 @@ namespace Perspex.Controls
get { return this.accessKeyHandler; }
}
/// <summary>
/// Gets or sets the keyboard navigation handler for the window.
/// </summary>
IKeyboardNavigationHandler IInputRoot.KeyboardNavigationHandler
{
get { return this.keyboardNavigationHandler; }
}
/// <summary>
/// Gets or sets a value indicating whether access keys are shown in the window.
/// </summary>

8
Perspex.Input/AccessKeyHandler.cs

@ -4,11 +4,11 @@
// </copyright>
// -----------------------------------------------------------------------
using Perspex.Interactivity;
using System;
namespace Perspex.Input
{
using System;
using Perspex.Interactivity;
/// <summary>
/// Handles access keys for a window.
/// </summary>
@ -38,6 +38,8 @@ namespace Perspex.Input
/// </remarks>
public void SetOwner(IInputRoot owner)
{
Contract.Requires<ArgumentNullException>(owner != null);
if (this.owner != null)
{
throw new InvalidOperationException("AccessKeyHandler owner has already been set.");

5
Perspex.Input/IInputRoot.cs

@ -16,6 +16,11 @@ namespace Perspex.Input
/// </summary>
IAccessKeyHandler AccessKeyHandler { get; }
/// <summary>
/// Gets or sets the keyboard navigation handler.
/// </summary>
IKeyboardNavigationHandler KeyboardNavigationHandler { get; }
/// <summary>
/// Gets or sets a value indicating whether access keys are shown in the window.
/// </summary>

21
Perspex.Input/IKeyboardNavigation.cs

@ -1,21 +0,0 @@
// -----------------------------------------------------------------------
// <copyright file="IKeyboardNavigation.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Input
{
public interface IKeyboardNavigation
{
IInputElement GetNextInTabOrder(IInputElement element);
IInputElement GetPreviousInTabOrder(IInputElement element);
void TabNext(IInputElement element);
void TabPrevious(IInputElement element);
void TabTo(IInputElement element);
}
}

35
Perspex.Input/IKeyboardNavigationHandler.cs

@ -0,0 +1,35 @@
// -----------------------------------------------------------------------
// <copyright file="IKeyboardNavigationHandler.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Input
{
/// <summary>
/// Defines the interface for classes that handle keyboard navigation for a window.
/// </summary>
public interface IKeyboardNavigationHandler
{
/// <summary>
/// Sets the owner of the keyboard navigation handler.
/// </summary>
/// <param name="owner">The owner.</param>
/// <remarks>
/// This method can only be called once, typically by the owner itself on creation.
/// </remarks>
void SetOwner(IInputRoot owner);
/// <summary>
/// Moves the focus to the next control in tab order.
/// </summary>
/// <param name="element">The current element.</param>
void TabNext(IInputElement element);
/// <summary>
/// Moves the focus to the previous control in tab order.
/// </summary>
/// <param name="element">The current element.</param>
void TabPrevious(IInputElement element);
}
}

15
Perspex.Input/InputElement.cs

@ -238,21 +238,6 @@ namespace Perspex.Input
protected virtual void OnKeyDown(KeyEventArgs e)
{
if (e.Key == Key.Tab && !e.Handled)
{
var shift = (e.Device.Modifiers & ModifierKeys.Shift) != 0;
if (!shift)
{
KeyboardNavigation.Instance.TabNext(this);
}
else
{
KeyboardNavigation.Instance.TabPrevious(this);
}
e.Handled = true;
}
}
protected virtual void OnKeyUp(KeyEventArgs e)

303
Perspex.Input/KeyboardNavigation.cs

@ -6,289 +6,70 @@
namespace Perspex.Input
{
using System;
using System.Collections.Generic;
using System.Linq;
using Perspex.VisualTree;
using Splat;
public class KeyboardNavigation : IKeyboardNavigation
/// <summary>
/// Defines attached properties that control keyboard navigation behaviour for a container.
/// </summary>
public static class KeyboardNavigation
{
/// <summary>
/// Defines the TabNavigation attached property.
/// </summary>
/// <remarks>
/// The TabNavigation attached property defines how pressing the Tab key causes focus to
/// be navigated between the children of the container.
/// </remarks>
public static readonly PerspexProperty<KeyboardNavigationMode> TabNavigationProperty =
PerspexProperty.RegisterAttached<KeyboardNavigation, InputElement, KeyboardNavigationMode>("TabNavigation");
PerspexProperty.RegisterAttached<InputElement, KeyboardNavigationMode>("TabNavigation", typeof(KeyboardNavigation));
/// <summary>
/// Defines the TabOnceActiveElement attached property.
/// </summary>
/// <remarks>
/// When focus enters a container which has its <see cref="TabNavigationProperty"/>
/// attached property set to <see cref="KeyboardNavigationMode.Once"/>, this property
/// defines to which child the focus should move.
/// </remarks>
public static readonly PerspexProperty<IInputElement> TabOnceActiveElementProperty =
PerspexProperty.RegisterAttached<KeyboardNavigation, InputElement, IInputElement>("TabOnceActiveElement");
public static IKeyboardNavigation Instance
{
get { return Locator.Current.GetService<IKeyboardNavigation>(); }
}
PerspexProperty.RegisterAttached<InputElement, IInputElement>("TabOnceActiveElement", typeof(KeyboardNavigation));
/// <summary>
/// Gets the <see cref="TabNavigationProperty"/> for a container.
/// </summary>
/// <param name="element">The container.</param>
/// <returns>The <see cref="KeyboardNavigationMode"/> for the container.</returns>
public static KeyboardNavigationMode GetTabNavigation(InputElement element)
{
return element.GetValue(TabNavigationProperty);
}
/// <summary>
/// Sets the <see cref="TabNavigationProperty"/> for a container.
/// </summary>
/// <param name="element">The container.</param>
/// <param name="value">The <see cref="KeyboardNavigationMode"/> for the container.</param>
public static void SetTabNavigation(InputElement element, KeyboardNavigationMode value)
{
element.SetValue(TabNavigationProperty, value);
}
/// <summary>
/// Gets the <see cref="TabOnceActiveElementProperty"/> for a container.
/// </summary>
/// <param name="element">The container.</param>
/// <returns>The active element for the container.</returns>
public static IInputElement GetTabOnceActiveElement(InputElement element)
{
return element.GetValue(TabOnceActiveElementProperty);
}
/// <summary>
/// Sets the <see cref="TabOnceActiveElementProperty"/> for a container.
/// </summary>
/// <param name="element">The container.</param>
/// <param name="value">The active element for the container.</param>
public static void SetTabOnceActiveElement(InputElement element, IInputElement value)
{
element.SetValue(TabOnceActiveElementProperty, value);
}
public IInputElement GetNextInTabOrder(IInputElement element)
{
Contract.Requires<ArgumentNullException>(element != null);
var container = element.GetVisualParent<IInputElement>();
if (container != null)
{
var mode = GetTabNavigation((InputElement)container);
switch (mode)
{
case KeyboardNavigationMode.Continue:
return GetNextInContainer(element, container) ??
GetFirstInNextContainer(container);
case KeyboardNavigationMode.Cycle:
return GetNextInContainer(element, container) ??
GetDescendents(container).FirstOrDefault();
default:
return GetFirstInNextContainer(container);
}
}
else
{
return GetDescendents(element).FirstOrDefault();
}
}
public IInputElement GetPreviousInTabOrder(IInputElement element)
{
Contract.Requires<ArgumentNullException>(element != null);
var container = element.GetVisualParent<IInputElement>();
if (container != null)
{
var mode = GetTabNavigation((InputElement)container);
switch (mode)
{
case KeyboardNavigationMode.Continue:
return GetPreviousInContainer(element, container) ??
GetLastInPreviousContainer(element);
case KeyboardNavigationMode.Cycle:
return GetPreviousInContainer(element, container) ??
GetDescendents(container).LastOrDefault();
default:
return GetLastInPreviousContainer(container);
}
}
else
{
return GetDescendents(element).LastOrDefault();
}
}
public void TabNext(IInputElement element)
{
Contract.Requires<ArgumentNullException>(element != null);
var next = GetNextInTabOrder(element);
if (next != null)
{
TabTo(next);
}
}
public void TabPrevious(IInputElement element)
{
Contract.Requires<ArgumentNullException>(element != null);
var next = GetPreviousInTabOrder(element);
if (next != null)
{
TabTo(next);
}
}
public void TabTo(IInputElement element)
{
Contract.Requires<ArgumentNullException>(element != null);
FocusManager.Instance.Focus(element, true);
}
private static bool CanFocus(IInputElement e) => e.Focusable && e.IsEnabledCore && e.IsVisible;
private static bool CanFocusDescendent(IInputElement e) => e.IsEnabledCore && e.IsVisible;
private static IEnumerable<IInputElement> GetDescendents(IInputElement element)
{
var mode = GetTabNavigation((InputElement)element);
if (mode == KeyboardNavigationMode.Never)
{
yield break;
}
var children = element.GetVisualChildren().OfType<IInputElement>();
if (mode == KeyboardNavigationMode.Once)
{
var active = GetTabOnceActiveElement((InputElement)element);
if (active != null)
{
yield return active;
yield break;
}
else
{
children = children.Take(1);
}
}
foreach (var child in children)
{
if (CanFocus(child))
{
yield return child;
}
if (CanFocusDescendent(child))
{
foreach (var descendent in GetDescendents(child))
{
yield return descendent;
}
}
}
}
private static IInputElement GetNextInContainer(IInputElement element, IInputElement container)
{
var descendent = GetDescendents(element).FirstOrDefault();
if (descendent != null)
{
return descendent;
}
else if (container != null)
{
var sibling = container.GetVisualChildren()
.OfType<IInputElement>()
.Where(CanFocus)
.SkipWhile(x => x != element)
.Skip(1)
.FirstOrDefault();
if (sibling != null)
{
return sibling;
}
}
return null;
}
private static IInputElement GetPreviousInContainer(IInputElement element, IInputElement container)
{
return container.GetVisualChildren()
.OfType<IInputElement>()
.Where(CanFocus)
.TakeWhile(x => x != element)
.LastOrDefault();
}
private static IInputElement GetFirstInNextContainer(IInputElement container)
{
var parent = container.GetVisualParent<IInputElement>();
IInputElement next = null;
if (parent != null)
{
var sibling = parent.GetVisualChildren()
.OfType<IInputElement>()
.Where(CanFocusDescendent)
.SkipWhile(x => x != container)
.Skip(1)
.FirstOrDefault();
if (sibling != null)
{
if (CanFocus(sibling))
{
next = sibling;
}
else
{
next = GetDescendents(sibling).FirstOrDefault();
}
}
if (next == null)
{
next = GetFirstInNextContainer(parent);
}
}
else
{
next = GetDescendents(container).FirstOrDefault();
}
return next;
}
private static IInputElement GetLastInPreviousContainer(IInputElement container)
{
var parent = container.GetVisualParent<IInputElement>();
IInputElement next = null;
if (parent != null)
{
var sibling = parent.GetVisualChildren()
.OfType<IInputElement>()
.Where(CanFocusDescendent)
.TakeWhile(x => x != container)
.LastOrDefault();
if (sibling != null)
{
if (CanFocus(sibling))
{
next = sibling;
}
else
{
next = GetDescendents(sibling).LastOrDefault();
}
}
if (next == null)
{
next = GetLastInPreviousContainer(parent);
}
}
else
{
next = GetDescendents(container).LastOrDefault();
}
return next;
}
}
}

362
Perspex.Input/KeyboardNavigationHandler.cs

@ -0,0 +1,362 @@
// -----------------------------------------------------------------------
// <copyright file="KeyboardNavigationHandler.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Input
{
using System;
using System.Collections.Generic;
using System.Linq;
using Perspex.VisualTree;
/// <summary>
/// Handles keyboard navigation for a window.
/// </summary>
public class KeyboardNavigationHandler : IKeyboardNavigationHandler
{
/// <summary>
/// The window to which the handler belongs.
/// </summary>
private IInputRoot owner;
/// <summary>
/// Sets the owner of the keyboard navigation handler.
/// </summary>
/// <param name="owner">The owner.</param>
/// <remarks>
/// This method can only be called once, typically by the owner itself on creation.
/// </remarks>
public void SetOwner(IInputRoot owner)
{
Contract.Requires<ArgumentNullException>(owner != null);
if (this.owner != null)
{
throw new InvalidOperationException("AccessKeyHandler owner has already been set.");
}
this.owner = owner;
this.owner.AddHandler(InputElement.KeyDownEvent, this.OnKeyDown);
}
/// <summary>
/// Gets the next element in tab order.
/// </summary>
/// <param name="element">The element.</param>
/// <returns>The next element in tab order.</returns>
public static IInputElement GetNextInTabOrder(IInputElement element)
{
Contract.Requires<ArgumentNullException>(element != null);
var container = element.GetVisualParent<IInputElement>();
if (container != null)
{
var mode = KeyboardNavigation.GetTabNavigation((InputElement)container);
switch (mode)
{
case KeyboardNavigationMode.Continue:
return GetNextInContainer(element, container) ??
GetFirstInNextContainer(container);
case KeyboardNavigationMode.Cycle:
return GetNextInContainer(element, container) ??
GetDescendents(container).FirstOrDefault();
default:
return GetFirstInNextContainer(container);
}
}
else
{
return GetDescendents(element).FirstOrDefault();
}
}
/// <summary>
/// Gets the next element in tab order.
/// </summary>
/// <param name="element">The element.</param>
/// <returns>The next element in tab order.</returns>
public static IInputElement GetPreviousInTabOrder(IInputElement element)
{
Contract.Requires<ArgumentNullException>(element != null);
var container = element.GetVisualParent<IInputElement>();
if (container != null)
{
var mode = KeyboardNavigation.GetTabNavigation((InputElement)container);
switch (mode)
{
case KeyboardNavigationMode.Continue:
return GetPreviousInContainer(element, container) ??
GetLastInPreviousContainer(element);
case KeyboardNavigationMode.Cycle:
return GetPreviousInContainer(element, container) ??
GetDescendents(container).LastOrDefault();
default:
return GetLastInPreviousContainer(container);
}
}
else
{
return GetDescendents(element).LastOrDefault();
}
}
/// <summary>
/// Moves the focus to the next control in tab order.
/// </summary>
/// <param name="element">The current element.</param>
public void TabNext(IInputElement element)
{
Contract.Requires<ArgumentNullException>(element != null);
var next = GetNextInTabOrder(element);
if (next != null)
{
FocusManager.Instance.Focus(next, true);
}
}
/// <summary>
/// Moves the focus to the previous control in tab order.
/// </summary>
/// <param name="element">The current element.</param>
public void TabPrevious(IInputElement element)
{
Contract.Requires<ArgumentNullException>(element != null);
var next = GetPreviousInTabOrder(element);
if (next != null)
{
FocusManager.Instance.Focus(next, true);
}
}
/// <summary>
/// Checks if the specified element can be focused.
/// </summary>
/// <param name="e">The element.</param>
/// <returns>True if the element can be focused.</returns>
private static bool CanFocus(IInputElement e) => e.Focusable && e.IsEnabledCore && e.IsVisible;
/// <summary>
/// Checks if a descendent of the specified element can be focused.
/// </summary>
/// <param name="e">The element.</param>
/// <returns>True if a descendent of the element can be focused.</returns>
private static bool CanFocusDescendent(IInputElement e) => e.IsEnabledCore && e.IsVisible;
/// <summary>
/// Gets the focusable descendents of the specified element, depending on the element's
/// <see cref="KeyboardNavigation.TabNavigationProperty"/>.
/// </summary>
/// <param name="element">The element.</param>
/// <returns>The element's focusable descendents.</returns>
private static IEnumerable<IInputElement> GetDescendents(IInputElement element)
{
var mode = KeyboardNavigation.GetTabNavigation((InputElement)element);
if (mode == KeyboardNavigationMode.Never)
{
yield break;
}
var children = element.GetVisualChildren().OfType<IInputElement>();
if (mode == KeyboardNavigationMode.Once)
{
var active = KeyboardNavigation.GetTabOnceActiveElement((InputElement)element);
if (active != null)
{
yield return active;
yield break;
}
else
{
children = children.Take(1);
}
}
foreach (var child in children)
{
if (CanFocus(child))
{
yield return child;
}
if (CanFocusDescendent(child))
{
foreach (var descendent in GetDescendents(child))
{
yield return descendent;
}
}
}
}
/// <summary>
/// Gets the next item that should be focused in the specified container.
/// </summary>
/// <param name="element">The starting element/</param>
/// <param name="container">The container.</param>
/// <returns>The next element, or null if the element is the last.</returns>
private static IInputElement GetNextInContainer(IInputElement element, IInputElement container)
{
var descendent = GetDescendents(element).FirstOrDefault();
if (descendent != null)
{
return descendent;
}
else if (container != null)
{
var sibling = container.GetVisualChildren()
.OfType<IInputElement>()
.Where(CanFocus)
.SkipWhile(x => x != element)
.Skip(1)
.FirstOrDefault();
if (sibling != null)
{
return sibling;
}
}
return null;
}
/// <summary>
/// Gets the previous item that should be focused in the specified container.
/// </summary>
/// <param name="element">The starting element/</param>
/// <param name="container">The container.</param>
/// <returns>The previous element, or null if the element is the first.</returns>
private static IInputElement GetPreviousInContainer(IInputElement element, IInputElement container)
{
return container.GetVisualChildren()
.OfType<IInputElement>()
.Where(CanFocus)
.TakeWhile(x => x != element)
.LastOrDefault();
}
/// <summary>
/// Gets the first item that should be focused in the next container.
/// </summary>
/// <param name="container">The container.</param>
/// <returns>The first element, or null if there are no more elements.</returns>
private static IInputElement GetFirstInNextContainer(IInputElement container)
{
var parent = container.GetVisualParent<IInputElement>();
IInputElement next = null;
if (parent != null)
{
var sibling = parent.GetVisualChildren()
.OfType<IInputElement>()
.Where(CanFocusDescendent)
.SkipWhile(x => x != container)
.Skip(1)
.FirstOrDefault();
if (sibling != null)
{
if (CanFocus(sibling))
{
next = sibling;
}
else
{
next = GetDescendents(sibling).FirstOrDefault();
}
}
if (next == null)
{
next = GetFirstInNextContainer(parent);
}
}
else
{
next = GetDescendents(container).FirstOrDefault();
}
return next;
}
/// <summary>
/// Gets the last item that should be focused in the previous container.
/// </summary>
/// <param name="container">The container.</param>
/// <returns>The next element, or null if there are no more elements.</returns>
private static IInputElement GetLastInPreviousContainer(IInputElement container)
{
var parent = container.GetVisualParent<IInputElement>();
IInputElement next = null;
if (parent != null)
{
var sibling = parent.GetVisualChildren()
.OfType<IInputElement>()
.Where(CanFocusDescendent)
.TakeWhile(x => x != container)
.LastOrDefault();
if (sibling != null)
{
if (CanFocus(sibling))
{
next = sibling;
}
else
{
next = GetDescendents(sibling).LastOrDefault();
}
}
if (next == null)
{
next = GetLastInPreviousContainer(parent);
}
}
else
{
next = GetDescendents(container).LastOrDefault();
}
return next;
}
/// <summary>
/// Handles the Tab key being pressed in the window.
/// </summary>
/// <param name="sender">The event sender.</param>
/// <param name="e">The event args.</param>
protected virtual void OnKeyDown(object sender, KeyEventArgs e)
{
var current = FocusManager.Instance.Current;
if (e.Key == Key.Tab && current != null)
{
if ((KeyboardDevice.Instance.Modifiers & ModifierKeys.Shift) == 0)
{
this.TabNext(current);
}
else
{
this.TabPrevious(current);
}
}
}
}
}

3
Perspex.Input/Perspex.Input.csproj

@ -73,7 +73,7 @@
<Compile Include="IInputElement.cs" />
<Compile Include="IInputManager.cs" />
<Compile Include="IKeyboardDevice.cs" />
<Compile Include="IKeyboardNavigation.cs" />
<Compile Include="IKeyboardNavigationHandler.cs" />
<Compile Include="IMouseDevice.cs" />
<Compile Include="InputElement.cs" />
<Compile Include="InputExtensions.cs" />
@ -82,6 +82,7 @@
<Compile Include="Key.cs" />
<Compile Include="KeyboardDevice.cs" />
<Compile Include="KeyboardNavigation.cs" />
<Compile Include="KeyboardNavigationHandler.cs" />
<Compile Include="GotFocusEventArgs.cs" />
<Compile Include="Platform\IPlatformSettings.cs" />
<Compile Include="PointerPressEventArgs.cs" />

44
Tests/Perspex.Input.UnitTests/KeyboardNavigationTests.cs

@ -43,7 +43,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetNextInTabOrder(current);
Assert.Equal(next, result);
@ -81,7 +81,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetNextInTabOrder(current);
Assert.Equal(next, result);
@ -111,7 +111,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetNextInTabOrder(current);
Assert.Equal(next, result);
@ -155,7 +155,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetNextInTabOrder(current);
Assert.Equal(next, result);
@ -174,7 +174,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetNextInTabOrder(top);
Assert.Equal(next, result);
@ -218,7 +218,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetNextInTabOrder(current);
Assert.Equal(next, result);
@ -257,7 +257,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetNextInTabOrder(current);
Assert.Equal(next, result);
@ -296,7 +296,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetNextInTabOrder(current);
Assert.Equal(next, result);
@ -335,7 +335,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetNextInTabOrder(current);
Assert.Equal(next, result);
@ -376,7 +376,7 @@ namespace Perspex.Input.UnitTests
KeyboardNavigation.SetTabOnceActiveElement(container, next);
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetNextInTabOrder(current);
Assert.Equal(next, result);
@ -415,7 +415,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetNextInTabOrder(current);
Assert.Equal(next, result);
@ -456,7 +456,7 @@ namespace Perspex.Input.UnitTests
KeyboardNavigation.SetTabOnceActiveElement(container, next);
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetNextInTabOrder(current);
Assert.Equal(next, result);
@ -494,7 +494,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetPreviousInTabOrder(current);
Assert.Equal(next, result);
@ -532,7 +532,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetPreviousInTabOrder(current);
Assert.Equal(next, result);
@ -562,7 +562,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetPreviousInTabOrder(current);
Assert.Equal(next, result);
@ -606,7 +606,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetPreviousInTabOrder(current);
Assert.Equal(next, result);
@ -650,7 +650,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetPreviousInTabOrder(current);
Assert.Equal(next, result);
@ -689,7 +689,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetPreviousInTabOrder(current);
Assert.Equal(next, result);
@ -728,7 +728,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetPreviousInTabOrder(current);
Assert.Equal(next, result);
@ -767,7 +767,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetPreviousInTabOrder(current);
Assert.Equal(next, result);
@ -808,7 +808,7 @@ namespace Perspex.Input.UnitTests
KeyboardNavigation.SetTabOnceActiveElement(container, next);
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetPreviousInTabOrder(current);
Assert.Equal(next, result);
@ -847,7 +847,7 @@ namespace Perspex.Input.UnitTests
}
};
var target = new KeyboardNavigation();
var target = new KeyboardNavigationHandler();
var result = target.GetPreviousInTabOrder(current);
Assert.Equal(next, result);

Loading…
Cancel
Save