2010-11-07 11 views
8

Estoy enfrentando un gran problema con Silverlight para lidiar con el diseño. Principalmente, no puedo encontrar una manera de predecir el tamaño ocupado por las cadenas antes de que realmente se dibujen. En iPhone, tenemos algunos métodos muy simples que nos permiten determinar el tamaño que ocupará una cadena en la pantalla en función del tamaño de la fuente, la opción de ajuste de texto y el ancho y/o alto disponibles. Pero con Silverlight, no puedo encontrar una forma de obtener resultados consistentes en mi aplicación.Silverlight: ¿Cómo predecir el tamaño de la cuerda?

Actualmente estoy usando ActuelHeight y ActualWidth de una instancia de TextBlock pero me da resultados aleatorios. Por ejemplo, utilizo el siguiente código ...

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 se establece en 66 píxeles! Como puede adivinar por sí mismo, no hay forma de que un texto tan largo pueda caber en un rectángulo de 456 píxeles de ancho y 66 píxeles de alto. Y se confirma cuando agrego el bloque de texto dentro de un lienzo, establezco su tamaño en {456; 66} y pruebo la aplicación: ¡el texto no cabe en absoluto en el bloque de texto!

¿Puede alguien explicarme dónde radica el problema y señalarme una forma consistente (y confiable) de medir los tamaños de las cuerdas?

Gracias por adelantado,

Eric.

+0

Cuando se establece el desplazamiento de auto, usted será capaz de ver todo el texto desplazándose, así que ¿por qué quiere saber el tamaño de pixeles? –

Respuesta

12

Usted puede pedir al TextBlock para medir en sí (sin embargo, se muestra) llamando a su Measure método:

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

Por supuesto, puede que no tenga la anchura y la altura infinita, así que dependiendo de su caso de uso es posible que prefiera pedirle a su elemento raíz que se mida a sí mismo, lo que a su vez evaluará a todos los niños (incluido el TextBlock).

+1

Gracias, pero no funciona. Supongo que el TextBlock necesita mostrarse para que el método de medida funcione ... –

+0

@Eric MORAND ** Sugerencia **: se muestra, para medir, no tiene que significar visible en la pantalla –

+1

Para mí solo textBlock.ActualHeight y textBlock. ActualWidth funcionó. DesiredSize arrojó ceros. –

1

El TextBlock no cambiará de tamaño hasta que realmente se muestra ...

Para el resto creo que esto es una cuestión de diseño. En un entorno XAML no debería tener que saber/configurar pixelsizes con mucha frecuencia.

+0

Si TextBlock no cambiará de tamaño hasta que realmente se muestre, ¿cómo se supone que debo proporcionar una altura para mis plantillas de cuadro de lista? La documentación dice que debemos proporcionar a las plantillas una altura fija antes de que realmente se muestren, pero parece que no hay forma de calcular la altura de una plantilla hasta que realmente se muestre. –

3

Siempre que sea posible, intente crear un diseño donde no necesite conocer el tamaño físico de un bloque de texto. Use un diseño desplazable y un cambio de tamaño dinámico para evitar tener que saber esto.

Sin embargo, si realmente debe saber esto, puede intentar este truco desde el escritorio (donde no fue posible usar MeasureText - lo siento no es compatible con Silverlight). Agregue el bloque de texto a la interfaz de usuario, pero fuera del área visible o detrás de otro control. A continuación, puede obtener el tamaño real prestado.

1

Gracias por su ayuda chicos, en realidad mi primer método estaba funcionando! Pero olvidé establecer fontSize antes de recuperar ActualHeight, ¡y el padre lo configuró automáticamente una vez agregado al árbol visual! Así que 66 píxeles era realmente la altura correcta de mi bloque de texto con el pequeño tamaño de fuente utilizado por defecto por el bloque de texto. Una vez agregado al árbol visual, el tamaño de fuente del bloque de texto fue mucho más grande, lo que llevó a recortar.

Nuevamente, gracias por su ayuda!

-2

Mi solución es el uso de 3 o más 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"; 
} 
Cuestiones relacionadas