Jump focus when valid address detected
ADD
WalletWasabi.Fluent/Behaviors/FocusNextWhenValid.cs
+using System;
+using System.Reactive;
+using System.Reactive.Disposables;
+using System.Reactive.Linq;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Input;
+using ReactiveUI;
+
+namespace WalletWasabi.Fluent.Behaviors
+{
+ public class FocusNextWhenValid : DisposingBehavior<TextBox>
+ {
+ protected override void OnAttached(CompositeDisposable disposables)
+ {
+ var hasErrors = AssociatedObject.GetObservable(DataValidationErrors.HasErrorsProperty);
+ var text = AssociatedObject.GetObservable(TextBox.TextProperty);
+
+ hasErrors.Select(_ => Unit.Default)
+ .Merge(text.Select(_ => Unit.Default))
+ .Throttle(TimeSpan.FromMilliseconds(100))
+ .ObserveOn(RxApp.MainThreadScheduler)
+ .Subscribe(_ =>
+ {
+ if (AssociatedObject is { } &&
+ !DataValidationErrors.GetHasErrors(AssociatedObject) &&
+ !string.IsNullOrEmpty(AssociatedObject.Text) &&
+ KeyboardNavigationHandler.GetNext(AssociatedObject, NavigationDirection.Next) is { } nextFocus)
+ {
+ nextFocus.Focus();
+ }
+ })
+ .DisposeWith(disposables);
+ }
+ }
+}

MODIFY
WalletWasabi.Fluent/Controls/AnimatedButton.axaml
WalletWasabi.Fluent/Controls/AnimatedButton.axaml
<Setter Property="Template">
<ControlTemplate>
<Button Name="PART_Button"
+ Focusable="{TemplateBinding Focusable}"
Command="{TemplateBinding Command}"
CommandParameter="{TemplateBinding CommandParameter}"
Classes="plain">

MODIFY
WalletWasabi.Fluent/Views/Wallets/Send/SendView.axaml
WalletWasabi.Fluent/Views/Wallets/Send/SendView.axaml
Watermark="(e.g. Bitcoin address or PayJoin URL)">
<i:Interaction.Behaviors>
<behaviors:FocusOnAttachedBehavior />
+ <behaviors:FocusNextWhenValid />
</i:Interaction.Behaviors>
<TextBox.InnerRightContent>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Spacing="10" Margin="10 0">

Jump focus when valid address detected