diff --git a/Perspex.Input/FocusManager.cs b/Perspex.Input/FocusManager.cs index bf59e85bfd..eb8f3d73da 100644 --- a/Perspex.Input/FocusManager.cs +++ b/Perspex.Input/FocusManager.cs @@ -7,6 +7,7 @@ namespace Perspex.Input { using Perspex.Interactivity; + using Splat; public class FocusManager : IFocusManager { @@ -33,6 +34,13 @@ namespace Perspex.Input this.Current = control; + IKeyboardDevice keyboard = Locator.Current.GetService(); + + if (keyboard != null) + { + keyboard.FocusedElement = control; + } + if (next != null) { next.RaiseEvent(new RoutedEventArgs diff --git a/Perspex.Input/IKeyboardDevice.cs b/Perspex.Input/IKeyboardDevice.cs index 53e708a26e..a4801e55b7 100644 --- a/Perspex.Input/IKeyboardDevice.cs +++ b/Perspex.Input/IKeyboardDevice.cs @@ -28,6 +28,8 @@ namespace Perspex.Input public interface IKeyboardDevice : IInputDevice { + IInputElement FocusedElement { get; set; } + ModifierKeys Modifiers { get; } } } diff --git a/Perspex.Input/KeyboardDevice.cs b/Perspex.Input/KeyboardDevice.cs index d30afaa2a5..d7559b1351 100644 --- a/Perspex.Input/KeyboardDevice.cs +++ b/Perspex.Input/KeyboardDevice.cs @@ -35,7 +35,7 @@ namespace Perspex.Input public IInputElement FocusedElement { get; - protected set; + set; } public abstract ModifierKeys Modifiers { get; } @@ -49,7 +49,7 @@ namespace Perspex.Input switch (e.Type) { case RawKeyEventType.KeyDown: - element.RaiseEvent(new KeyEventArgs + KeyEventArgs ev = new KeyEventArgs { RoutedEvent = InputElement.PreviewKeyDownEvent, Device = this, @@ -57,16 +57,11 @@ namespace Perspex.Input Text = e.Text, Source = element, OriginalSource = element, - }); - element.RaiseEvent(new KeyEventArgs - { - RoutedEvent = InputElement.KeyDownEvent, - Device = this, - Key = e.Key, - Text = e.Text, - Source = element, - OriginalSource = element, - }); + }; + + element.RaiseEvent(ev); ; + ev.RoutedEvent = InputElement.KeyDownEvent; + element.RaiseEvent(ev); ; break; } } diff --git a/Perspex.Interactivity/Interactive.cs b/Perspex.Interactivity/Interactive.cs index 2815777dd9..f9c16d84f5 100644 --- a/Perspex.Interactivity/Interactive.cs +++ b/Perspex.Interactivity/Interactive.cs @@ -59,7 +59,7 @@ namespace Perspex.Interactivity { Contract.Requires(e != null); - if (e.RoutedEvent != null) + if (!e.Handled) { switch (e.RoutedEvent.RoutingStrategy) { diff --git a/Perspex.Windows/WindowsPlatform.cs b/Perspex.Windows/WindowsPlatform.cs index 5c808b4371..a04c5f1872 100644 --- a/Perspex.Windows/WindowsPlatform.cs +++ b/Perspex.Windows/WindowsPlatform.cs @@ -8,8 +8,10 @@ namespace Perspex.Windows { using System; using System.Collections.Generic; + using Perspex.Input; using Perspex.Platform; using Perspex.Threading; + using Perspex.Windows.Input; using Perspex.Windows.Interop; using Perspex.Windows.Threading; using Splat; @@ -24,6 +26,7 @@ namespace Perspex.Windows public static void Initialize() { var locator = Locator.CurrentMutable; + locator.Register(() => WindowsKeyboardDevice.Instance, typeof(IKeyboardDevice)); locator.Register(() => instance, typeof(IPlatformThreadingInterface)); }