Nello script precedente abbiamo visto come aggiungere un Flyout ad un controllo che eredita dalla classe Button. Per impostazione predefinita, il Flyout si chiude solo se l'utente clicca fuori dall'area che occupa. Spesso, per esigenze di UX, è necessario chiudere il Flyout alla pressione di un bottone, chiudendolo programmaticamente.
Nell'esempio che segue utilizziamo un'attached property per recuperare il Popup che contiene il Flyout.
namespace MyApp { public class CloseFlyoutAttachedBehavior : DependencyObject { public static bool GetCloseFlyout(DependencyObject obj) { return (bool)obj.GetValue(CloseFlyoutProperty); } public static void SetCloseFlyout(DependencyObject obj, bool value) { if (obj is Button) { ((Button)obj).Click += CloseFlyoutAttachedBehaviorClick; } } static void CloseFlyoutAttachedBehaviorClick(object sender, RoutedEventArgs e) { var flyout = ((Button)sender).GetFirstAncestorOfType<FlyoutPresenter>(); if (flyout != null) { ((Popup)flyout.Parent).IsOpen = false; } } public static readonly DependencyProperty CloseFlyoutProperty = DependencyProperty.RegisterAttached("CloseFlyout", typeof(bool), typeof(CloseFlyoutAttachedBehavior), new PropertyMetadata(true)); } }
Una volta impostata la proprietà CloseFlyout, viene invocato il metodo SetCloseFlyout, in cui registriamo un handler per l'evento Click del bottone che, useremo per chiudere il Flyout. L'event handler CloseFlyoutAttachedBehaviorClick percorrerà il visual tree fino a recuperare il FlyoutPresenter: a causa della composizione del VisualTree, non è possibile recuperare direttamente il controllo Flyout, quindi dal FlyoutPresenter recuperiamo il Popup che è utilizzato per visualizzare il contenuto del Flyout, utilizzando la proprietà Parent. Per concludere, non ci rimane che impostare la proprietà IsOpen su false.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Esportare ed analizzare le issue di GitHub con la CLI e GraphQL
Installare le Web App site extension tramite una pipeline di Azure DevOps
Gestire liste di tipi semplici con Entity Framework Core
Eseguire una query su SQL Azure tramite un workflow di GitHub
Utilizzare Model as a Service su Microsoft Azure
Ottimizzare la latenza in Blazor 8 tramite InteractiveAuto render mode
Accesso sicuro ai secrets attraverso i file in Azure Container Apps
Gestire errori funzionali tramite exception in ASP.NET Core Web API
Sfruttare MQTT in cloud e in edge con Azure Event Grid
Sostituire la GitHub Action di login su private registry
Short-circuiting della Pipeline in ASP.NET Core
Controllare gli accessi IP alle app con Azure Container Apps