StatusBar gestita con la proprietà .Tag dei controlli sulla Window
Questa volta vi rimando direttamente al post del mio (nostro) amico Corrado, che è stato così gentile e paziente da sopportarmi sul Messenger per aiutarmi a venire a capo del (piccolo) problema che avevo. 🙂
Supponiamo di avere una Window con un certo numero di controlli (TextBox in primo luogo, ma non solo). Supponiamo di avere anche una StatusBar, con cui vogliamo dare alcuni tip all’utente che sta usando l’applicazione stessa. L’obiettivo era quello di mostrare sulla StatusBar un tip diverso a seconda della TextBox che ha il focus in quel momento. Dopo aver litigato con XAML per mezza giornata e ieri sera, il buon Corrado ha regalato la soluzione che ho linkato prima.
Solo alcune precisazioni. Riporto il codice dell’evento OnGotFocus:
private void OnGotFocus (object sender, RoutedEventArgs e) { sbi.Content = (sender as TextBox).Tag.ToString(); }
Questo event-handler è agganciato tramite stile al RoutedEvent GotFocus di tutte le TextBox sulla Window. Come dice giustamente Corrado, il testo da visualizzare nella StatusBar viene prelevato direttamente dalla proprietà Tag della TextBox, che nella fattispecie è il sender dell’evento. C’è un primo minuscolo problema: se nello XAML la proprietà Tag non viene impostata, essa vale null, per cui il codice qui sopra bomberebbe con una bella Exception! Nulla di che: lo si sistema con una if veloce. C’è anche un secondo problema: vorrei poter impostare la proprietà Tag anche su controlli diversi dalla TextBox ed ottenere lo stesso effetto sulla StatusBar. Nel codice qui sopra il cast bomberebbe: l’ideale è fare il cast verso Control, che espone Tag ed è “polimorfica” rispetto a tutti (?) i controlli su una Window.
Il codice riportato qui sopra è stato corretto come segue:
private void OnGotFocus(object sender, RoutedEventArgs e) { object tip = (sender as Control).Tag; if (tip != null) barra.Content = tip.ToString(); else barra.Content = string.Empty; }
Questo funziona a meraviglia. Ovviamente è necessario associare l’EventSetter anche sullo stile dedicato, per esempio, alle ComboBox:
<Style TargetType="{x:Type ComboBox}"> <Setter Property="Margin" Value="4" /> <Setter Property="VerticalAlignment" Value="Center" /> <Setter Property="FontSize" Value="12" /> <EventSetter Event="GotFocus" Handler="OnGotFocus" /> </Style>
Finito! Adesso posso impostare il Tag su TextBox e ComboBox e la StatusBar mostra un piccolo tip sotto forma di stringa, che aiuta l’utente e gli dice cosa deve inserire in ogni campo.
Technorati Tags: programming .NET WPF