From b612be79dbc50d354e836c95dfb834179e3fa350 Mon Sep 17 00:00:00 2001 From: Julien Lebosquain Date: Thu, 12 Mar 2026 11:14:41 +0100 Subject: [PATCH] Add FocusChangedEventArgs for GotFocus/LotFocus (#20859) * Add FocusChangedEventArgs for GotFocus/LotFocus * Update API suppressions --- api/Avalonia.nupkg.xml | 96 +++++++++++++++++++ .../Input/FocusChangedEventArgs.cs | 39 ++++++++ src/Avalonia.Base/Input/GotFocusEventArgs.cs | 24 ----- src/Avalonia.Base/Input/IInputElement.cs | 4 +- src/Avalonia.Base/Input/InputElement.cs | 20 ++-- src/Avalonia.Base/Input/KeyboardDevice.cs | 22 +++-- .../ColorSpectrum/ColorSpectrum.cs | 4 +- .../AutoCompleteBox/AutoCompleteBox.cs | 4 +- src/Avalonia.Controls/Button.cs | 2 +- src/Avalonia.Controls/Calendar/Calendar.cs | 4 +- .../CalendarDatePicker/CalendarDatePicker.cs | 4 +- src/Avalonia.Controls/ComboBox.cs | 2 +- src/Avalonia.Controls/Control.cs | 4 +- src/Avalonia.Controls/GridSplitter.cs | 2 +- src/Avalonia.Controls/ItemsControl.cs | 2 +- src/Avalonia.Controls/MaskedTextBox.cs | 4 +- src/Avalonia.Controls/MenuItem.cs | 2 +- .../NumericUpDown/NumericUpDown.cs | 4 +- .../Platform/DefaultMenuInteractionHandler.cs | 2 +- .../Primitives/SelectingItemsControl.cs | 4 +- src/Avalonia.Controls/Primitives/TabStrip.cs | 2 +- .../Primitives/TabStripItem.cs | 2 +- src/Avalonia.Controls/ScrollViewer.cs | 2 +- src/Avalonia.Controls/SelectableTextBlock.cs | 4 +- src/Avalonia.Controls/TabControl.cs | 2 +- src/Avalonia.Controls/TabItem.cs | 2 +- src/Avalonia.Controls/TextBox.cs | 4 +- src/Avalonia.Controls/TreeView.cs | 2 +- .../ListBoxTests_Single.cs | 4 +- 29 files changed, 197 insertions(+), 76 deletions(-) create mode 100644 src/Avalonia.Base/Input/FocusChangedEventArgs.cs delete mode 100644 src/Avalonia.Base/Input/GotFocusEventArgs.cs diff --git a/api/Avalonia.nupkg.xml b/api/Avalonia.nupkg.xml index 146d6df001..b4c8bba386 100644 --- a/api/Avalonia.nupkg.xml +++ b/api/Avalonia.nupkg.xml @@ -109,6 +109,12 @@ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll current/Avalonia/lib/net10.0/Avalonia.Base.dll + + CP0001 + T:Avalonia.Input.GotFocusEventArgs + baseline/Avalonia/lib/net10.0/Avalonia.Base.dll + current/Avalonia/lib/net10.0/Avalonia.Base.dll + CP0001 T:Avalonia.Input.IDataObject @@ -571,6 +577,12 @@ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll current/Avalonia/lib/net8.0/Avalonia.Base.dll + + CP0001 + T:Avalonia.Input.GotFocusEventArgs + baseline/Avalonia/lib/net8.0/Avalonia.Base.dll + current/Avalonia/lib/net8.0/Avalonia.Base.dll + CP0001 T:Avalonia.Input.IDataObject @@ -961,6 +973,18 @@ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll current/Avalonia/lib/net10.0/Avalonia.Base.dll + + CP0002 + F:Avalonia.Input.InputElement.GotFocusEvent + baseline/Avalonia/lib/net10.0/Avalonia.Base.dll + current/Avalonia/lib/net10.0/Avalonia.Base.dll + + + CP0002 + F:Avalonia.Input.InputElement.LostFocusEvent + baseline/Avalonia/lib/net10.0/Avalonia.Base.dll + current/Avalonia/lib/net10.0/Avalonia.Base.dll + CP0002 F:Avalonia.Media.DrawingImage.ViewboxProperty @@ -1177,6 +1201,18 @@ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll current/Avalonia/lib/net10.0/Avalonia.Base.dll + + CP0002 + M:Avalonia.Input.InputElement.OnGotFocus(Avalonia.Input.GotFocusEventArgs) + baseline/Avalonia/lib/net10.0/Avalonia.Base.dll + current/Avalonia/lib/net10.0/Avalonia.Base.dll + + + CP0002 + M:Avalonia.Input.InputElement.OnLostFocus(Avalonia.Interactivity.RoutedEventArgs) + baseline/Avalonia/lib/net10.0/Avalonia.Base.dll + current/Avalonia/lib/net10.0/Avalonia.Base.dll + CP0002 M:Avalonia.Input.InputElement.RemovePinchEndedHandler(Avalonia.Interactivity.Interactive,System.EventHandler{Avalonia.Input.PinchEndedEventArgs}) @@ -1861,6 +1897,12 @@ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll current/Avalonia/lib/net10.0/Avalonia.Controls.dll + + CP0002 + M:Avalonia.Controls.Platform.DefaultMenuInteractionHandler.GotFocus(System.Object,Avalonia.Input.GotFocusEventArgs) + baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll + current/Avalonia/lib/net10.0/Avalonia.Controls.dll + CP0002 M:Avalonia.Controls.Platform.IInsetsManager.get_DisplayEdgeToEdge @@ -2365,6 +2407,18 @@ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll current/Avalonia/lib/net8.0/Avalonia.Base.dll + + CP0002 + F:Avalonia.Input.InputElement.GotFocusEvent + baseline/Avalonia/lib/net8.0/Avalonia.Base.dll + current/Avalonia/lib/net8.0/Avalonia.Base.dll + + + CP0002 + F:Avalonia.Input.InputElement.LostFocusEvent + baseline/Avalonia/lib/net8.0/Avalonia.Base.dll + current/Avalonia/lib/net8.0/Avalonia.Base.dll + CP0002 F:Avalonia.Media.DrawingImage.ViewboxProperty @@ -2581,6 +2635,18 @@ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll current/Avalonia/lib/net8.0/Avalonia.Base.dll + + CP0002 + M:Avalonia.Input.InputElement.OnGotFocus(Avalonia.Input.GotFocusEventArgs) + baseline/Avalonia/lib/net8.0/Avalonia.Base.dll + current/Avalonia/lib/net8.0/Avalonia.Base.dll + + + CP0002 + M:Avalonia.Input.InputElement.OnLostFocus(Avalonia.Interactivity.RoutedEventArgs) + baseline/Avalonia/lib/net8.0/Avalonia.Base.dll + current/Avalonia/lib/net8.0/Avalonia.Base.dll + CP0002 M:Avalonia.Input.InputElement.RemovePinchEndedHandler(Avalonia.Interactivity.Interactive,System.EventHandler{Avalonia.Input.PinchEndedEventArgs}) @@ -3265,6 +3331,12 @@ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll current/Avalonia/lib/net8.0/Avalonia.Controls.dll + + CP0002 + M:Avalonia.Controls.Platform.DefaultMenuInteractionHandler.GotFocus(System.Object,Avalonia.Input.GotFocusEventArgs) + baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll + current/Avalonia/lib/net8.0/Avalonia.Controls.dll + CP0002 M:Avalonia.Controls.Platform.IInsetsManager.get_DisplayEdgeToEdge @@ -3799,6 +3871,18 @@ baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll + + CP0006 + E:Avalonia.Input.IInputElement.GotFocus + baseline/Avalonia/lib/net10.0/Avalonia.Base.dll + current/Avalonia/lib/net10.0/Avalonia.Base.dll + + + CP0006 + E:Avalonia.Input.IInputElement.LostFocus + baseline/Avalonia/lib/net10.0/Avalonia.Base.dll + current/Avalonia/lib/net10.0/Avalonia.Base.dll + CP0006 M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers,System.Nullable{Avalonia.Input.KeyDeviceType}) @@ -4063,6 +4147,18 @@ baseline/Avalonia/lib/net6.0/Avalonia.OpenGL.dll current/Avalonia/lib/net6.0/Avalonia.OpenGL.dll + + CP0006 + E:Avalonia.Input.IInputElement.GotFocus + baseline/Avalonia/lib/net8.0/Avalonia.Base.dll + current/Avalonia/lib/net8.0/Avalonia.Base.dll + + + CP0006 + E:Avalonia.Input.IInputElement.LostFocus + baseline/Avalonia/lib/net8.0/Avalonia.Base.dll + current/Avalonia/lib/net8.0/Avalonia.Base.dll + CP0006 M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers,System.Nullable{Avalonia.Input.KeyDeviceType}) diff --git a/src/Avalonia.Base/Input/FocusChangedEventArgs.cs b/src/Avalonia.Base/Input/FocusChangedEventArgs.cs new file mode 100644 index 0000000000..ade599ee08 --- /dev/null +++ b/src/Avalonia.Base/Input/FocusChangedEventArgs.cs @@ -0,0 +1,39 @@ +using Avalonia.Interactivity; + +namespace Avalonia.Input +{ + /// + /// Represents the arguments of and . + /// + public class FocusChangedEventArgs : RoutedEventArgs, IKeyModifiersEventArgs + { + /// + /// Initializes a new instance of . + /// + /// The routed event associated with these event args. + public FocusChangedEventArgs(RoutedEvent routedEvent) + : base(routedEvent) + { + } + + /// + /// Gets or sets the element that focus has moved to. + /// + public IInputElement? NewFocusedElement { get; init; } + + /// + /// Gets or sets the element that previously had focus. + /// + public IInputElement? OldFocusedElement { get; init; } + + /// + /// Gets or sets a value indicating how the change in focus occurred. + /// + public NavigationMethod NavigationMethod { get; init; } + + /// + /// Gets or sets any key modifiers active at the time of focus. + /// + public KeyModifiers KeyModifiers { get; init; } + } +} diff --git a/src/Avalonia.Base/Input/GotFocusEventArgs.cs b/src/Avalonia.Base/Input/GotFocusEventArgs.cs deleted file mode 100644 index 658bf5aae5..0000000000 --- a/src/Avalonia.Base/Input/GotFocusEventArgs.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Avalonia.Interactivity; - -namespace Avalonia.Input -{ - /// - /// Holds arguments for a . - /// - public class GotFocusEventArgs : RoutedEventArgs, IKeyModifiersEventArgs - { - public GotFocusEventArgs() : base(InputElement.GotFocusEvent) - { - } - - /// - /// Gets or sets a value indicating how the change in focus occurred. - /// - public NavigationMethod NavigationMethod { get; init; } - - /// - /// Gets or sets any key modifiers active at the time of focus. - /// - public KeyModifiers KeyModifiers { get; init; } - } -} diff --git a/src/Avalonia.Base/Input/IInputElement.cs b/src/Avalonia.Base/Input/IInputElement.cs index 39dc30befd..f69f7ea343 100644 --- a/src/Avalonia.Base/Input/IInputElement.cs +++ b/src/Avalonia.Base/Input/IInputElement.cs @@ -14,12 +14,12 @@ namespace Avalonia.Input /// /// Occurs when the control receives focus. /// - event EventHandler? GotFocus; + event EventHandler? GotFocus; /// /// Occurs when the control loses focus. /// - event EventHandler? LostFocus; + event EventHandler? LostFocus; /// /// Occurs when a key is pressed while the control has focus. diff --git a/src/Avalonia.Base/Input/InputElement.cs b/src/Avalonia.Base/Input/InputElement.cs index 98b988f8cd..1beccf341e 100644 --- a/src/Avalonia.Base/Input/InputElement.cs +++ b/src/Avalonia.Base/Input/InputElement.cs @@ -79,8 +79,8 @@ namespace Avalonia.Input /// /// Defines the event. /// - public static readonly RoutedEvent GotFocusEvent = - RoutedEvent.Register(nameof(GotFocus), RoutingStrategies.Bubble); + public static readonly RoutedEvent GotFocusEvent = + RoutedEvent.Register(nameof(GotFocus), RoutingStrategies.Bubble); /// /// Defines the event. @@ -91,8 +91,8 @@ namespace Avalonia.Input /// /// Defines the event. /// - public static readonly RoutedEvent LostFocusEvent = - RoutedEvent.Register(nameof(LostFocus), RoutingStrategies.Bubble); + public static readonly RoutedEvent LostFocusEvent = + RoutedEvent.Register(nameof(LostFocus), RoutingStrategies.Bubble); /// /// Defines the event. @@ -278,7 +278,7 @@ namespace Avalonia.Input /// /// Occurs when the control receives focus. /// - public event EventHandler? GotFocus + public event EventHandler? GotFocus { add { AddHandler(GotFocusEvent, value); } remove { RemoveHandler(GotFocusEvent, value); } @@ -296,7 +296,7 @@ namespace Avalonia.Input /// /// Occurs when the control loses focus. /// - public event EventHandler? LostFocus + public event EventHandler? LostFocus { add { AddHandler(LostFocusEvent, value); } remove { RemoveHandler(LostFocusEvent, value); } @@ -593,7 +593,7 @@ namespace Avalonia.Input UpdateIsEffectivelyEnabled(); } - private void OnGotFocusCore(GotFocusEventArgs e) + private void OnGotFocusCore(FocusChangedEventArgs e) { var isFocused = e.Source == this; _isFocusVisible = isFocused && (e.NavigationMethod == NavigationMethod.Directional || e.NavigationMethod == NavigationMethod.Tab); @@ -617,11 +617,11 @@ namespace Avalonia.Input /// for this event. /// /// Data about the event. - protected virtual void OnGotFocus(GotFocusEventArgs e) + protected virtual void OnGotFocus(FocusChangedEventArgs e) { } - private void OnLostFocusCore(RoutedEventArgs e) + private void OnLostFocusCore(FocusChangedEventArgs e) { _isFocusVisible = false; IsFocused = false; @@ -634,7 +634,7 @@ namespace Avalonia.Input /// for this event. /// /// Data about the event. - protected virtual void OnLostFocus(RoutedEventArgs e) + protected virtual void OnLostFocus(FocusChangedEventArgs e) { } diff --git a/src/Avalonia.Base/Input/KeyboardDevice.cs b/src/Avalonia.Base/Input/KeyboardDevice.cs index 3d9764528a..e2b530a91a 100644 --- a/src/Avalonia.Base/Input/KeyboardDevice.cs +++ b/src/Avalonia.Base/Input/KeyboardDevice.cs @@ -188,25 +188,35 @@ namespace Avalonia.Input if (changeFocus) { + var oldElement = FocusedElement; + // Clear keyboard focus from currently focused element - if (FocusedElement != null && - (!((Visual)FocusedElement).IsAttachedToVisualTree || + if (oldElement != null && + (!((Visual)oldElement).IsAttachedToVisualTree || _focusedRoot != ((Visual?)element)?.GetInputRoot()) && _focusedRoot != null) { ClearChildrenFocusWithin(_focusedRoot.RootElement, true); } - SetIsFocusWithin(FocusedElement, element); + SetIsFocusWithin(oldElement, element); _focusedElement = element; _focusedRoot = (_focusedElement as Visual)?.GetInputRoot(); - interactive?.RaiseEvent(new RoutedEventArgs(InputElement.LostFocusEvent)); + interactive?.RaiseEvent(new FocusChangedEventArgs(InputElement.LostFocusEvent) + { + OldFocusedElement = oldElement, + NewFocusedElement = element, + NavigationMethod = method, + KeyModifiers = keyModifiers + }); - (element as Interactive)?.RaiseEvent(new GotFocusEventArgs + (element as Interactive)?.RaiseEvent(new FocusChangedEventArgs(InputElement.GotFocusEvent) { + OldFocusedElement = oldElement, + NewFocusedElement = element, NavigationMethod = method, - KeyModifiers = keyModifiers, + KeyModifiers = keyModifiers }); _textInputManager.SetFocusedElement(element); diff --git a/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs b/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs index 7ddd6d15ec..39cd5f0c5b 100644 --- a/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs +++ b/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs @@ -348,7 +348,7 @@ namespace Avalonia.Controls.Primitives } /// - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { // We only want to bother with the color name tool tip if we can provide color names. if (_selectionEllipsePanel != null && @@ -363,7 +363,7 @@ namespace Avalonia.Controls.Primitives } /// - protected override void OnLostFocus(RoutedEventArgs e) + protected override void OnLostFocus(FocusChangedEventArgs e) { // We only want to bother with the color name tool tip if we can provide color names. if (_selectionEllipsePanel != null && diff --git a/src/Avalonia.Controls/AutoCompleteBox/AutoCompleteBox.cs b/src/Avalonia.Controls/AutoCompleteBox/AutoCompleteBox.cs index 880fd0ac8a..0520d7643f 100644 --- a/src/Avalonia.Controls/AutoCompleteBox/AutoCompleteBox.cs +++ b/src/Avalonia.Controls/AutoCompleteBox/AutoCompleteBox.cs @@ -740,7 +740,7 @@ namespace Avalonia.Controls /// /// A /// that contains the event data. - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { base.OnGotFocus(e); FocusChanged(HasFocus()); @@ -752,7 +752,7 @@ namespace Avalonia.Controls /// /// A /// that contains the event data. - protected override void OnLostFocus(RoutedEventArgs e) + protected override void OnLostFocus(FocusChangedEventArgs e) { base.OnLostFocus(e); FocusChanged(HasFocus()); diff --git a/src/Avalonia.Controls/Button.cs b/src/Avalonia.Controls/Button.cs index 9e2d1725ce..ceadae432c 100644 --- a/src/Avalonia.Controls/Button.cs +++ b/src/Avalonia.Controls/Button.cs @@ -453,7 +453,7 @@ namespace Avalonia.Controls } /// - protected override void OnLostFocus(RoutedEventArgs e) + protected override void OnLostFocus(FocusChangedEventArgs e) { base.OnLostFocus(e); diff --git a/src/Avalonia.Controls/Calendar/Calendar.cs b/src/Avalonia.Controls/Calendar/Calendar.cs index d0a5e2e890..dc8ea002d9 100644 --- a/src/Avalonia.Controls/Calendar/Calendar.cs +++ b/src/Avalonia.Controls/Calendar/Calendar.cs @@ -2118,7 +2118,7 @@ namespace Avalonia.Controls } } - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { base.OnGotFocus(e); HasFocusInternal = true; @@ -2157,7 +2157,7 @@ namespace Avalonia.Controls } } - protected override void OnLostFocus(RoutedEventArgs e) + protected override void OnLostFocus(FocusChangedEventArgs e) { base.OnLostFocus(e); HasFocusInternal = false; diff --git a/src/Avalonia.Controls/CalendarDatePicker/CalendarDatePicker.cs b/src/Avalonia.Controls/CalendarDatePicker/CalendarDatePicker.cs index c07d43b77c..6a3f44aa5f 100644 --- a/src/Avalonia.Controls/CalendarDatePicker/CalendarDatePicker.cs +++ b/src/Avalonia.Controls/CalendarDatePicker/CalendarDatePicker.cs @@ -390,7 +390,7 @@ namespace Avalonia.Controls } /// - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { base.OnGotFocus(e); if(IsEnabled && _textBox != null && e.NavigationMethod == NavigationMethod.Tab) @@ -406,7 +406,7 @@ namespace Avalonia.Controls } /// - protected override void OnLostFocus(RoutedEventArgs e) + protected override void OnLostFocus(FocusChangedEventArgs e) { base.OnLostFocus(e); diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs index c4af8467c0..c977ca0a38 100644 --- a/src/Avalonia.Controls/ComboBox.cs +++ b/src/Avalonia.Controls/ComboBox.cs @@ -453,7 +453,7 @@ namespace Avalonia.Controls return new ComboBoxAutomationPeer(this); } - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { if (IsEditable && _inputTextBox != null) { diff --git a/src/Avalonia.Controls/Control.cs b/src/Avalonia.Controls/Control.cs index 8efe5d6d66..edd647f772 100644 --- a/src/Avalonia.Controls/Control.cs +++ b/src/Avalonia.Controls/Control.cs @@ -380,7 +380,7 @@ namespace Avalonia.Controls } /// - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { base.OnGotFocus(e); @@ -414,7 +414,7 @@ namespace Avalonia.Controls } /// - protected override void OnLostFocus(RoutedEventArgs e) + protected override void OnLostFocus(FocusChangedEventArgs e) { base.OnLostFocus(e); diff --git a/src/Avalonia.Controls/GridSplitter.cs b/src/Avalonia.Controls/GridSplitter.cs index df502207c6..e44289649d 100644 --- a/src/Avalonia.Controls/GridSplitter.cs +++ b/src/Avalonia.Controls/GridSplitter.cs @@ -449,7 +449,7 @@ namespace Avalonia.Controls } } - protected override void OnLostFocus(RoutedEventArgs e) + protected override void OnLostFocus(FocusChangedEventArgs e) { base.OnLostFocus(e); diff --git a/src/Avalonia.Controls/ItemsControl.cs b/src/Avalonia.Controls/ItemsControl.cs index c176f3aeee..a3900874a1 100644 --- a/src/Avalonia.Controls/ItemsControl.cs +++ b/src/Avalonia.Controls/ItemsControl.cs @@ -532,7 +532,7 @@ namespace Avalonia.Controls _itemsPresenter = e.NameScope.Find("PART_ItemsPresenter"); } - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { base.OnGotFocus(e); diff --git a/src/Avalonia.Controls/MaskedTextBox.cs b/src/Avalonia.Controls/MaskedTextBox.cs index 08855d253c..cfbd072a88 100644 --- a/src/Avalonia.Controls/MaskedTextBox.cs +++ b/src/Avalonia.Controls/MaskedTextBox.cs @@ -186,7 +186,7 @@ namespace Avalonia.Controls protected override Type StyleKeyOverride => typeof(TextBox); /// - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { if (HidePromptOnLeave == true && MaskProvider != null) { @@ -283,7 +283,7 @@ namespace Avalonia.Controls } /// - protected override void OnLostFocus(RoutedEventArgs e) + protected override void OnLostFocus(FocusChangedEventArgs e) { if (HidePromptOnLeave && MaskProvider != null) { diff --git a/src/Avalonia.Controls/MenuItem.cs b/src/Avalonia.Controls/MenuItem.cs index 231dcc6a53..6bd0383463 100644 --- a/src/Avalonia.Controls/MenuItem.cs +++ b/src/Avalonia.Controls/MenuItem.cs @@ -506,7 +506,7 @@ namespace Avalonia.Controls } /// - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { base.OnGotFocus(e); ItemsControlFromItemContainer(this)?.UpdateSelectionFromEvent(this, e); diff --git a/src/Avalonia.Controls/NumericUpDown/NumericUpDown.cs b/src/Avalonia.Controls/NumericUpDown/NumericUpDown.cs index ab3861db47..ddaa57f2f2 100644 --- a/src/Avalonia.Controls/NumericUpDown/NumericUpDown.cs +++ b/src/Avalonia.Controls/NumericUpDown/NumericUpDown.cs @@ -440,14 +440,14 @@ namespace Avalonia.Controls } /// - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { base.OnGotFocus(e); FocusChanged(IsKeyboardFocusWithin); } /// - protected override void OnLostFocus(RoutedEventArgs e) + protected override void OnLostFocus(FocusChangedEventArgs e) { CommitInput(true); base.OnLostFocus(e); diff --git a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs index f8d8c43d3c..38bae7be8a 100644 --- a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs +++ b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs @@ -52,7 +52,7 @@ namespace Avalonia.Controls.Platform public static TimeSpan MenuShowDelay { get; set;} = TimeSpan.FromMilliseconds(400); - protected internal virtual void GotFocus(object? sender, GotFocusEventArgs e) + protected internal virtual void GotFocus(object? sender, FocusChangedEventArgs e) { var item = GetMenuItemCore(e.Source as Control); diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs index d78d6e07c2..1d6a44c0b3 100644 --- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs +++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs @@ -896,12 +896,12 @@ namespace Avalonia.Controls.Primitives { case PointerEventArgs pointerEvent when ShouldTriggerSelection(container, pointerEvent): case KeyEventArgs keyEvent when ShouldTriggerSelection(container, keyEvent): - case GotFocusEventArgs: + case FocusChangedEventArgs: UpdateSelection(containerIndex, true, ItemSelectionEventTriggers.HasRangeSelectionModifier(container, eventArgs), ItemSelectionEventTriggers.HasToggleSelectionModifier(container, eventArgs), eventArgs is PointerEventArgs { Properties.IsRightButtonPressed: true }, - eventArgs is GotFocusEventArgs); + eventArgs is FocusChangedEventArgs); eventArgs.Handled = true; return true; diff --git a/src/Avalonia.Controls/Primitives/TabStrip.cs b/src/Avalonia.Controls/Primitives/TabStrip.cs index 29cf48ce9e..6a206f0304 100644 --- a/src/Avalonia.Controls/Primitives/TabStrip.cs +++ b/src/Avalonia.Controls/Primitives/TabStrip.cs @@ -32,7 +32,7 @@ namespace Avalonia.Controls.Primitives public override bool UpdateSelectionFromEvent(Control container, RoutedEventArgs eventArgs) { - if (eventArgs is GotFocusEventArgs { NavigationMethod: not NavigationMethod.Directional }) + if (eventArgs is FocusChangedEventArgs { NavigationMethod: not NavigationMethod.Directional }) { return false; } diff --git a/src/Avalonia.Controls/Primitives/TabStripItem.cs b/src/Avalonia.Controls/Primitives/TabStripItem.cs index 0053255613..1dcd55078d 100644 --- a/src/Avalonia.Controls/Primitives/TabStripItem.cs +++ b/src/Avalonia.Controls/Primitives/TabStripItem.cs @@ -7,7 +7,7 @@ namespace Avalonia.Controls.Primitives /// public class TabStripItem : ListBoxItem { - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { base.OnGotFocus(e); UpdateSelectionFromEvent(e); diff --git a/src/Avalonia.Controls/ScrollViewer.cs b/src/Avalonia.Controls/ScrollViewer.cs index e93180fff4..2593c4b475 100644 --- a/src/Avalonia.Controls/ScrollViewer.cs +++ b/src/Avalonia.Controls/ScrollViewer.cs @@ -766,7 +766,7 @@ namespace Avalonia.Controls } } - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { base.OnGotFocus(e); diff --git a/src/Avalonia.Controls/SelectableTextBlock.cs b/src/Avalonia.Controls/SelectableTextBlock.cs index f3532763f6..493c1631d4 100644 --- a/src/Avalonia.Controls/SelectableTextBlock.cs +++ b/src/Avalonia.Controls/SelectableTextBlock.cs @@ -160,14 +160,14 @@ namespace Avalonia.Controls SetCurrentValue(SelectionEndProperty, SelectionStart); } - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { base.OnGotFocus(e); UpdateCommandStates(); } - protected override void OnLostFocus(RoutedEventArgs e) + protected override void OnLostFocus(FocusChangedEventArgs e) { base.OnLostFocus(e); diff --git a/src/Avalonia.Controls/TabControl.cs b/src/Avalonia.Controls/TabControl.cs index 67274247c2..cb619a941d 100644 --- a/src/Avalonia.Controls/TabControl.cs +++ b/src/Avalonia.Controls/TabControl.cs @@ -237,7 +237,7 @@ namespace Avalonia.Controls public override bool UpdateSelectionFromEvent(Control container, RoutedEventArgs eventArgs) { - if (eventArgs is GotFocusEventArgs { NavigationMethod: not NavigationMethod.Directional }) + if (eventArgs is FocusChangedEventArgs { NavigationMethod: not NavigationMethod.Directional }) { return false; } diff --git a/src/Avalonia.Controls/TabItem.cs b/src/Avalonia.Controls/TabItem.cs index 07f2cd6505..a4829c16ca 100644 --- a/src/Avalonia.Controls/TabItem.cs +++ b/src/Avalonia.Controls/TabItem.cs @@ -111,7 +111,7 @@ namespace Avalonia.Controls e.Handled = true; } - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { base.OnGotFocus(e); UpdateSelectionFromEvent(e); diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index 447a6a41fc..eadb54b58a 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -1088,7 +1088,7 @@ namespace Avalonia.Controls CanPaste = !IsReadOnly; } - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { base.OnGotFocus(e); @@ -1114,7 +1114,7 @@ namespace Avalonia.Controls _presenter?.ShowCaret(); } - protected override void OnLostFocus(RoutedEventArgs e) + protected override void OnLostFocus(FocusChangedEventArgs e) { base.OnLostFocus(e); diff --git a/src/Avalonia.Controls/TreeView.cs b/src/Avalonia.Controls/TreeView.cs index 033be87c7f..d48997f390 100644 --- a/src/Avalonia.Controls/TreeView.cs +++ b/src/Avalonia.Controls/TreeView.cs @@ -550,7 +550,7 @@ namespace Avalonia.Controls } /// - protected override void OnGotFocus(GotFocusEventArgs e) + protected override void OnGotFocus(FocusChangedEventArgs e) { if (e.NavigationMethod == NavigationMethod.Directional) { diff --git a/tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs b/tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs index f0f9b820f7..1c2d43e94f 100644 --- a/tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs +++ b/tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs @@ -35,7 +35,7 @@ namespace Avalonia.Controls.UnitTests Prepare(target); - target.Presenter!.Panel!.Children[0].RaiseEvent(new GotFocusEventArgs + target.Presenter!.Panel!.Children[0].RaiseEvent(new FocusChangedEventArgs(InputElement.GotFocusEvent) { NavigationMethod = NavigationMethod.Tab, }); @@ -57,7 +57,7 @@ namespace Avalonia.Controls.UnitTests AvaloniaLocator.CurrentMutable.Bind().ToConstant(new PlatformHotkeyConfiguration()); Prepare(target); - target.Presenter!.Panel!.Children[0].RaiseEvent(new GotFocusEventArgs + target.Presenter!.Panel!.Children[0].RaiseEvent(new FocusChangedEventArgs(InputElement.GotFocusEvent) { NavigationMethod = NavigationMethod.Directional, KeyModifiers = KeyModifiers.Control