1

Feb

Mandare il testo a capo in una TextBlock

Spesso e volentieri può capitarvi, in un’applicazione Windows Phone, di dover visualizzare all’interno di una TextBlock del testo che sia disposto su più linee.

Farlo via XAML è molto semplice: il controllo TextBlock può contenere uno o più tag Run che, accompagnati dal tag LineBreak, ci permettono di suddividere il testo in più righe, come nell’esempio.


      
      
      
      

La proprietà Text del tag Run, esattamente come per il controllo TextBlock, supporta il binding, quindi possiamo usare questo stratagemma, ad esempio, nell’ItemTemplate di una ListBox per mostrare una lista di dati con una formattazione particolare. Ipotizziamo ad esempio di avere una sorgente dati che contenga una serie di informazioni su una persona: nome, cognome, indirizzo, città, cap, ecc. Volendo mostrare l’indirizzo completo della persona in un’unico TextBlock, potremmo creare più Run e metterle in binding con le singole informazioni recuperate dalla sorgente, come nell’esempio:


      
      
      
      
      

Il risultato sarebbe qualcosa del tipo:

Via Montenapoleone 15
20158 – Milano

In questo caso siamo stati facilitati dal fatto che le informazioni che volevamo mostrare erano già separate in più proprietà: a volte però può capitare di avere un’unica proprietà contenente un lungo testo, che abbiamo la necessità di suddividere in più righe. Pensiamo ad un’applicazione dedicata alle ricette: nel database potremmo avere un unico campo con tutti gli ingredienti, che noi però vogliamo mostrare separati su diverse righe.

In questo caso, ci viene in aiuto la stringa \r\n, che rappresenta il line break: questa stringa speciale, invece di essere mostrata a video, forza il testo ad andare a capo. Ecco che uno XAML come il seguente:

viene visualizzato a video come:

Questo è un testo
su due righe

E se qualcosa va storto?

Nello sviluppo di un’applicazione mi è capitato che questo meccanismo, all’apparenza,  non funzionasse: la stringa \r\n, invece di mandare a capo il testo, veniva visualizzata a video. Una prima analisi del problema non ha portato ad una soluzione: la stringa era scritta correttamente e nella sorgente dati (nel mio caso, un database SQL CE locale) era inserita nel modo giusto. Cosa è andato storto? Ci è voluto il debugger di Visual Studio per scoprire l’arcano:

image

Come potete vedere dal valore della proprietà Ingredients, la stringa viene riconosciuta dal compilatore come \\r\\n, ovvero con due slash di troppo. La cosa curiosa è che il Text Visualizer di Visual Studio, invece, mostrava il testo correttamente:

SNAGHTML2629a58a

La soluzione a questo punto è stata molto semplice: è stato sufficiente fare un replace nel testo della stringa \\r\\n con la stringa \r\n, come nell’esempio:

CurrentItem.Ingredients = CurrentItem.Ingredients.Replace("\\r\\n", "\r\n");
by Il blog di Matteo Pagani on 2/1/2012
Post archive