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
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Cache policy su route groups di Minimal API in ASP.NET Core 7
Implementare il throttling in ASP.NET Core
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Usare ASP.NET Core dev tunnels per testare le applicazioni su internet
Load test di ASP.NET Core con k6
Short-circuiting della Pipeline in ASP.NET Core