|
|
@ -34,7 +34,11 @@ namespace Avalonia.Input |
|
|
{ |
|
|
{ |
|
|
InputElement.PointerPressedEvent.AddClassHandler( |
|
|
InputElement.PointerPressedEvent.AddClassHandler( |
|
|
typeof(IInputElement), |
|
|
typeof(IInputElement), |
|
|
new EventHandler<RoutedEventArgs>(OnPreviewPointerPressed), |
|
|
new EventHandler<RoutedEventArgs>(OnPreviewPointerEventHandler), |
|
|
|
|
|
RoutingStrategies.Tunnel); |
|
|
|
|
|
InputElement.PointerReleasedEvent.AddClassHandler( |
|
|
|
|
|
typeof(IInputElement), |
|
|
|
|
|
new EventHandler<RoutedEventArgs>(OnPreviewPointerEventHandler), |
|
|
RoutingStrategies.Tunnel); |
|
|
RoutingStrategies.Tunnel); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -194,6 +198,17 @@ namespace Avalonia.Input |
|
|
/// <returns>True if the element can be focused.</returns>
|
|
|
/// <returns>True if the element can be focused.</returns>
|
|
|
internal static bool CanFocus(IInputElement e) => e.Focusable && e.IsEffectivelyEnabled && IsVisible(e); |
|
|
internal static bool CanFocus(IInputElement e) => e.Focusable && e.IsEffectivelyEnabled && IsVisible(e); |
|
|
|
|
|
|
|
|
|
|
|
private static bool CanPointerFocus(IInputElement e, PointerEventArgs ev) |
|
|
|
|
|
{ |
|
|
|
|
|
if (CanFocus(e)) |
|
|
|
|
|
{ |
|
|
|
|
|
if (ev.Pointer.Type == PointerType.Mouse || ev is PointerReleasedEventArgs) |
|
|
|
|
|
return true; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// Gets the focus scope of the specified control, traversing popups.
|
|
|
/// Gets the focus scope of the specified control, traversing popups.
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
@ -241,21 +256,21 @@ namespace Avalonia.Input |
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
/// <param name="sender">The event sender.</param>
|
|
|
/// <param name="sender">The event sender.</param>
|
|
|
/// <param name="e">The event args.</param>
|
|
|
/// <param name="e">The event args.</param>
|
|
|
private static void OnPreviewPointerPressed(object? sender, RoutedEventArgs e) |
|
|
private static void OnPreviewPointerEventHandler(object? sender, RoutedEventArgs e) |
|
|
{ |
|
|
{ |
|
|
if (sender is null) |
|
|
if (sender is null) |
|
|
return; |
|
|
return; |
|
|
|
|
|
|
|
|
var ev = (PointerPressedEventArgs)e; |
|
|
var ev = (PointerEventArgs)e; |
|
|
var visual = (Visual)sender; |
|
|
var visual = (Visual)sender; |
|
|
|
|
|
|
|
|
if (sender == e.Source && ev.GetCurrentPoint(visual).Properties.IsLeftButtonPressed) |
|
|
if (sender == e.Source && (ev.GetCurrentPoint(visual).Properties.IsLeftButtonPressed || (e as PointerReleasedEventArgs)?.InitialPressMouseButton == MouseButton.Left)) |
|
|
{ |
|
|
{ |
|
|
Visual? element = ev.Pointer?.Captured as Visual ?? e.Source as Visual; |
|
|
Visual? element = ev.Pointer?.Captured as Visual ?? e.Source as Visual; |
|
|
|
|
|
|
|
|
while (element != null) |
|
|
while (element != null) |
|
|
{ |
|
|
{ |
|
|
if (element is IInputElement inputElement && CanFocus(inputElement)) |
|
|
if (element is IInputElement inputElement && CanPointerFocus(inputElement, ev)) |
|
|
{ |
|
|
{ |
|
|
inputElement.Focus(NavigationMethod.Pointer, ev.KeyModifiers); |
|
|
inputElement.Focus(NavigationMethod.Pointer, ev.KeyModifiers); |
|
|
|
|
|
|
|
|
|