2010-11-07 15 views
8

Sto affrontando un sacco di problemi con Silverlight come affrontare il layout. Soprattutto, non riesco a trovare un modo per prevedere la dimensione occupata dalle stringhe prima che vengano effettivamente disegnate. Su iPhone, abbiamo alcuni metodi molto semplici che ci permettono di determinare le dimensioni che una stringa occuperà sullo schermo in base alle dimensioni del carattere, all'opzione di ritorno a capo e alla larghezza e/o altezza disponibili. Ma con Silverlight, non riesco a trovare un modo per avere risultati coerenti attraverso la mia app.Silverlight: come prevedere la dimensione della stringa?

Attualmente sto usando l'istanza ActuelHeight e ActualWidth di TextBlock ma mi dà risultati casuali. Ad esempio, io uso il seguente codice ...

TextBlock proto = new TextBlock(); 

proto.Width = 456; 
proto.TextWrapping = TextWrapping.Wrap; 
proto.Text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; 
double h = proto.ActualHeight; 

... h è impostato su 66 pixel! Come puoi intuire da solo, non c'è modo che un testo così lungo possa adattarsi a un rettangolo di 456 pixel di larghezza e 66 di altezza. E viene confermato quando aggiungo il blocco di testo all'interno di una tela, ne imposto le dimensioni a {456; 66} e provo l'app: il testo non si adatta affatto al blocco di testo!

Qualcuno può spiegarmi dove si trova il problema e indicarmi un modo coerente (e affidabile) per misurare le dimensioni delle stringhe?

Grazie anticipatamente,

Eric.

+0

Quando si imposta lo scorrimento su auto, si sarà in grado di visualizzare tutto il testo scorrendo, quindi perché vuoi conoscere la dimensione in pixel? –

risposta

12

Si può chiedere al TextBlock per misurare se stessa (senza ancora essere visualizzato) chiamando il suo Measure metodo:

textBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
var width = textBlock.DesiredSize.Width; 
var height = textBlock.DesiredSize.Height; 

Naturalmente, non può avere larghezza e l'altezza infinita, quindi a seconda del vostro caso d'uso potresti preferire chiedere al tuo elemento radice di misurarsi da solo, che a sua volta misurerà tutti i bambini (incluso lo TextBlock).

+1

Grazie, ma non funziona. Suppongo che il TextBlock debba essere mostrato affinché il metodo di misura funzioni ... –

+0

@Eric MORAND ** Suggerimento **: visualizzato, per misurare, non deve significare visibile sullo schermo –

+1

Per me solo textBlock.ActualHeight e textBlock. ActualWidth ha funzionato. DesiredSize ha restituito degli zeri. –

1

Il TextBlock non ridimensionare fino a quando non è realmente visibile ...

Per il resto credo che questo sia una questione di design. In un ambiente XAML non dovresti sapere/impostare pixelizes molto spesso.

+0

Se TextBlock non viene ridimensionato fino a quando non viene effettivamente visualizzato, come dovrei fornire un'altezza per i miei modelli di caselle di riepilogo? La documentazione dice che dovremmo fornire i modelli a un'altezza fissa prima di essere effettivamente visualizzati, ma sembra che non ci sia modo di calcolare l'altezza di un modello finché non viene effettivamente mostrato. –

3

Ove possibile, provare e creare un disegno in cui non è necessario conoscere la dimensione fisica di un blocco di testo. Utilizzare un design a scorrimento e ridimensionamento dinamico per evitare di doverlo sapere.

Tuttavia, se proprio devi saperlo, puoi provare questo trucco dal desktop (dove non era possibile usare MeasureText - scusa non supportata in Silverlight). Aggiungi il blocco di testo all'interfaccia utente ma all'esterno dell'area visibile o dietro un altro controllo. Si potrebbe quindi ottenere la dimensione effettiva del rendering.

1

Grazie per il vostro aiuto ragazzi, in realtà il mio primo metodo funzionava! Ma ho dimenticato di impostare fontSize prima di recuperare ActualHeight - ed è stato impostato automaticamente dal genitore una volta aggiunto all'albero visivo! Quindi 66 pixel era effettivamente l'altezza giusta del mio blocco di testo con la piccola dimensione del carattere usata di default dal blocco di testo. Una volta aggiunto all'albero visivo, la dimensione del carattere del blocco di testo era molto più grande, portando a cliping.

Ancora grazie per il vostro aiuto!

-2

La mia soluzione è quella di utilizzare 3 o più TextBlocks:

string[] dataSeparator = new string[] { "\n" }; 
string[] data; 
data = longString.Split(dataSeparator, StringSplitOptions.None); 
TB1.Text = string.Empty; 
TB2.Text = string.Empty; 
TB3.Text = string.Empty; 
int length = data.Length/3; 
for (int i = 0; i < length; i++) 
{ 
    TB1.Text += data[i] + "\n"; 
} 
for (int i = length; i < length * 2; i++) 
{ 
    TB2.Text += data[i] + "\n"; 
} 
for (int i = length * 2; i < data.Length; i++) 
{ 
    TB3.Text += data[i] + "\n"; 
} 
Problemi correlati