Una delle caratteristiche più apprezzate di Silverlight è sicuramente la facilità con la quale è possibile realizzare layout fluidi, cioè in grado di ridimensionarsi per adattarsi a ogni dimensione dello schermo.
In scenari come questo è possibile che alcune parti dell'interfaccia, che mostrano del testo, siano brutalmente troncate, in modo non proprio estetico.
Per evitarlo possiamo realizzare un controllo che adatti il testo alla dimensione del contenitore, aggiungendo i tre punti sospensivi alla fine dello stesso.
Per prima cosa creiamo una nuova classe estendendo il tipo ContentControl:
public class DynamicTextBlock : ContentControl { private TextBlock textBlock; public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(DynamicTextBlock), new PropertyMetadata(null, new PropertyChangedCallback(OnTextChanged))); public DynamicTextBlock() { this.textBlock = new TextBlock(); this.Content = this.textBlock; } public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ((DynamicTextBlock)d).OnTextChanged(e); } protected virtual void OnTextChanged(DependencyPropertyChangedEventArgs e) { this.InvalidateMeasure(); } }
Nel costruttore della classe assegniamo alla proprietà Content un'istanza del controllo TextBlock, della quale manteniamo un riferimento in un campo privato.
Dichiariamo inoltre una DependencyProperty dal nome Text, che utilizzeremo per impostare e recuperare il testo visualizzato/da visualizzare.
Ogniqualvolta andremo a modificare il testo, come specificato nei metadati, verrà eseguito il metodo OnTextChanged che causa il ricalcolo delle dimensioni del controllo.
protected override Size MeasureOverride(Size availableSize) { string reducedText = this.Text; this.textBlock.Text = reducedText; if (reducedText.LastIndexOf("...") < 0) reducedText += "..."; while (textBlock.ActualWidth > availableSize.Width) { if (reducedText.LastIndexOf("...") > 1) { reducedText = string.Concat(reducedText.Substring(0, reducedText.LastIndexOf("...") - 1), "..."); this.textBlock.Text = reducedText; } else break; } return base.MeasureOverride(availableSize); }
È infatti nell'override del metodo MeasureOverride, che in base alla spazio disponibile e allo spazio occupato dalla TextBlock, che andremo ad eseguire il trim del testo, in modo da impedire che venga brutalmente troncato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Testare le impostazioni CORS di un'applicazione ASP.NET Core
Effettuare il tracing asincrono delle chiamate a un'applicazione ASP.NET Core
Registrare un servizio generico nella dependency injection di ASP.NET Core
L'agenda di #netconfit è online => https://aspit.co/netconfit-20 3 track, tante sessioni e una keynote speciale di @shanselman per la più importante conferenza in lingua italiana su .NET! Vi aspettiamo il 24/11. Iscrizioni sempre aperte! #donet #aspnet #netconf
Eseguire lo shutdown pulito di un'applicazione ASP.NET Core
Eseguire del codice personalizzato al click di una checkbox in Blazor
.NET Conference Italia 2020
Registrare un servizio generico nella dependency injection di ASP.NET Core
I più letti di oggi
- Creare template HTML con Slim
- Migrare da Entity Framework 6 ad Entity Framework Core 5
- Chiamare direttamente un numero di telefono con HTML5
- Introduzione al framework Javascript jQuery con esempi pratici di utilizzo
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Effettuare il redirect da HTTP a HTTPS con la Azure CDN