A cross-platform UI framework for .NET
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

86 lines
2.7 KiB

// -----------------------------------------------------------------------
// <copyright file="KeyboardNavigation.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Input
{
using System.Linq;
using Perspex.VisualTree;
using Splat;
public class KeyboardNavigation : IKeyboardNavigation
{
public static IKeyboardNavigation Instance
{
get { return Locator.Current.GetService<IKeyboardNavigation>(); }
}
public bool MoveNext(IInputElement element)
{
var parent = element.GetVisualParent();
var descendent = element.GetVisualDescendents()
.OfType<IInputElement>()
.Where(x => x.Focusable && x.IsEnabledCore)
.FirstOrDefault();
if (descendent != null)
{
FocusManager.Instance.Focus(descendent, true);
return true;
}
else if (parent != null)
{
var sibling = parent.GetVisualChildren()
.OfType<IInputElement>()
.Where(x => x.Focusable && x.IsEnabledCore)
.SkipWhile(x => x != element)
.Skip(1)
.FirstOrDefault();
if (sibling != null)
{
FocusManager.Instance.Focus(sibling, true);
return true;
}
}
return false;
}
public bool MovePrevious(IInputElement element)
{
var parent = element.GetVisualParent();
var descendent = element.GetVisualDescendents()
.OfType<IInputElement>()
.Where(x => x.Focusable && x.IsEnabledCore)
.Reverse()
.FirstOrDefault();
if (descendent != null)
{
FocusManager.Instance.Focus(descendent, true);
return true;
}
else if (parent != null)
{
var previous = parent.GetVisualChildren()
.OfType<IInputElement>()
.Where(x => x.Focusable && x.IsEnabledCore)
.Reverse()
.SkipWhile(x => x != element)
.Skip(1)
.FirstOrDefault();
if (previous != null)
{
FocusManager.Instance.Focus(previous, true);
return true;
}
}
return false;
}
}
}