diff --git a/demo/Sandbox/Views/MainWindow.axaml b/demo/Sandbox/Views/MainWindow.axaml index ba61022e..d1f30fdc 100644 --- a/demo/Sandbox/Views/MainWindow.axaml +++ b/demo/Sandbox/Views/MainWindow.axaml @@ -17,29 +17,17 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/src/Ursa/Controls/NumericUpDown/NumericUpDownBase.cs b/src/Ursa/Controls/NumericUpDown/NumericUpDownBase.cs index e4130e77..78268cf3 100644 --- a/src/Ursa/Controls/NumericUpDown/NumericUpDownBase.cs +++ b/src/Ursa/Controls/NumericUpDown/NumericUpDownBase.cs @@ -26,6 +26,7 @@ public abstract class NumericUpDown : TemplatedControl, IClearControl, IInnerCon protected ButtonSpinner? _spinner; protected TextBox? _textBox; protected internal Panel? _dragPanel; + private bool _isFocused; private Point? _point; protected internal bool _updateFromTextInput; @@ -149,6 +150,7 @@ public bool ShowButtonSpinner static NumericUpDown() { + FocusableProperty.OverrideDefaultValue(true); NumberFormatProperty.Changed.AddClassHandler((o, e) => o.OnFormatChange(e)); FormatStringProperty.Changed.AddClassHandler((o, e) => o.OnFormatChange(e)); IsReadOnlyProperty.Changed.AddClassHandler((o, args) => o.OnIsReadOnlyChanged(args)); @@ -216,6 +218,34 @@ protected override void OnLostFocus(RoutedEventArgs e) { _dragPanel.IsVisible = true; } + FocusChanged(IsKeyboardFocusWithin); + } + + protected override void OnGotFocus(GotFocusEventArgs e) + { + base.OnGotFocus(e); + FocusChanged(IsKeyboardFocusWithin); + } + + private void FocusChanged(bool hasFocus) + { + // The OnGotFocus & OnLostFocus are asynchronously and cannot + // reliably tell you that have the focus. All they do is let you + // know that the focus changed sometime in the past. To determine + // if you currently have the focus you need to do consult the + // FocusManager. + + bool wasFocused = _isFocused; + _isFocused = hasFocus; + + if (hasFocus) + { + + if (!wasFocused && _textBox != null) + { + _textBox.Focus(); + } + } } protected override void OnKeyDown(KeyEventArgs e)