Trim del testo di una TextBlock con Silverlight 3.0

di Marco Leoncini, in Silverlight 3.0,

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:

C#
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.

C#
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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi