In alcuni casi può capitare di dover spostare il focus da un elemento dell'UI all'altro. Nel momento in cui si assegna il focus, ad esempio ad una TextBox, viene immediatamente mostrata la keyboard associata.
Per esigenze di UX e UI, l'elemento che deve ricevere il focus può non essere sempre visibile, e, magari, deve entrare nella view con una breve animazione.
Per evitare di assegnare troppo presto il focus all'elemento, dobbiamo attendere la conclusione dello StoryBoard con l'animazione.
Possiamo creare un Behavior per assegnare il focus solo quando lo StoryBoard assegnato termina e l'oggetto è ormai in posizione.
public class FocusOnCompleStoryBoardBehavior : Behavior<TextBox> { public static readonly DependencyProperty StoryboardProperty = DependencyProperty.Register("Storyboard", typeof(Storyboard),typeof(FocusOnCompleStoryBoardBehavior),new PropertyMetadata(new PropertyChangedCallback(FocusOnCompleStoryBoardBehavior.OnStoryboardChanged))); protected static void OnStoryboardChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) { FocusOnCompleStoryBoardBehavior action = sender as FocusOnCompleStoryBoardBehavior; if (action.Storyboard != null) action.Storyboard.Completed += action.StoryboardOnCompleted; } [CustomPropertyValueEditor(System.Windows.Interactivity.CustomPropertyValueEditor.Storyboard)] public Storyboard Storyboard { get { return (Storyboard)base.GetValue(StoryboardProperty); } set { base.SetValue(StoryboardProperty, value); } } private void StoryboardOnCompleted(object sender, EventArgs eventArgs) { AssociatedObject.Focus(); } }
Abbiamo creato una nuova classe che estende Behavior<T> e sostituiamo T con il tipo TextBox. Questo vuol dire che il Behavior è assegnabile solo alle TextBox.
Infine, creiamo un nuova DependencyProperty chiamata Storyboard, come il tipo. Nel callback invocato quando il valore della proprietà cambia, ci registriamo per l'evento Completed dello Storyboard. Quando quest'event handler viene invocato, non facciamo altro che spostare il focus sulla TextBox associata.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Eseguire i worklow di GitHub su runner potenziati
Configurare dependabot per aggiornare le dipendenze di terze parti con GitHub Actions
Effettuare lo stream della risposta in ASP.NET Core tramite IAsyncEnumerable
Inizializzare i container in Azure Container Apps
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Generare token per autenicarsi sulle API di GitHub
Utilizzare i primary constructor di C# per inizializzare le proprietà
Gestire errori funzionali tramite exception in ASP.NET Core Web API
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione
Utilizzare QuickGrid di Blazor con Entity Framework
Gestione degli stili CSS con le regole @layer