El uso de WPF, ¿cuál es la forma más eficiente para medir un gran número de cadenas cortas? Específicamente, me gustaría para determinar la altura de la pantalla de cada cadena, dado el formato uniforme (la misma fuente, el tamaño, el peso, etc.) y la anchura máxima de la cadena puede ocupar?texto de medición en WPF
Respuesta
La técnica de nivel más bajo (y por lo tanto, que ofrece el mayor margen para optimizaciones creativas) es utilizar GlyphRuns.
no es muy bien documentada, pero me escribió un pequeño ejemplo aquí:
http://smellegantcode.wordpress.com/2008/07/03/glyphrun-and-so-forth/
El ejemplo se resuelve la longitud de la cadena como un paso necesario antes de mostrarlos.
Puede utilizar la propiedad DesiredSize en un cuadro de texto prestados para obtener la altura y la anchura
using System.Windows.Threading;
...
Double TextWidth = 0;
Double TextHeight = 0;
...
MyTextBox.Text = "Words to measure size of";
this.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new DispatcherOperationCallback(delegate(Object state) {
var size = MyTextBox.DesiredSize;
this.TextWidth = size.Width;
this.TextHeight = size.Height;
return null;
}
) , null);
Si usted tiene un gran número de cadenas puede ser más rápido a la primera pre-calualte la altura y la anchura de cada indiviudal letra y símbolo en una fuente dada, y luego hacer un cálculo basado en los caracteres de cadena. Esto puede no ser 100% exacto debido a interletraje, etc.
es muy simple y hecho por clase FormattedText! Inténtelo.
FormattedText no está disponible en UniversalWindows, ayúdame! –
En WPF:
recuerde llamar a Medida() en el TextBlock antes de leer la propiedad DesiredSize.
Si el TextBlock fue creado en la marcha, y sin embargo no se muestra, usted tiene que llamar a Medida() primero, así:
MyTextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
return new Size(MyTextBlock.DesiredSize.Width, MyTextBlock.DesiredSize.Height);
En Silverlight:
No es necesario medir
return new Size(TextBlock.ActualWidth, TextBlock.ActualHeight);
El código completo es el siguiente:
public Size MeasureString(string s) {
if (string.IsNullOrEmpty(s)) {
return new Size(0, 0);
}
var TextBlock = new TextBlock() {
Text = s
};
#if SILVERLIGHT
return new Size(TextBlock.ActualWidth, TextBlock.ActualHeight);
#else
TextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
return new Size(TextBlock.DesiredSize.Width, TextBlock.DesiredSize.Height);
#endif
}
- 1. Medición de ancho de texto en Qt
- 2. Controles de medición creados en tiempo de ejecución en WPF
- 3. medición cadena con Graphics.MeasureString
- 4. Medición de latencia
- 5. Medición de distancias cortas
- 6. Medición en un sitio web
- 7. Medición Descargar Speed Java
- 8. mostrando texto seleccionable WPF
- 9. Kalman Tracking - Varianza de medición
- 10. Cobertura del código de medición en Delphi
- 11. Medición de tiempo precisa en Java
- 12. Estadísticas del proceso de medición en Linux
- 13. Justificación de texto en WPF hipervínculo
- 14. contextual Editor de texto en WPF
- 15. Formato de texto WPF en GridViewColumn
- 16. Alineación vertical en WPF cuadro de texto
- 17. Efecto texto de Starwars en WPF
- 18. Medición de la altura del texto que se dibujará en Canvas (Android)
- 19. Medición del tiempo transcurrido en python
- 20. Alineación vertical del texto en WPF TextBlock
- 21. WPF: texto truncado automático en TextBlock
- 22. WPF: Obtener texto "ajustado" de un cuadro de texto
- 23. WPF vinculante dentro texto literal
- 24. Medición del ancho del texto que se dibujará en Canvas (Android)
- 25. WPF texto Wrap vs WrapWithOverflow
- 26. WPF TextBlock texto cambiado notifique
- 27. C - tiempo de cálculo de medición
- 28. Buenas herramientas de medición de código?
- 29. WPF: Cuadro de texto texto no se actualiza
- 30. Medición de la resolución de `std :: clock()`
La misma pregunta en los foros de MSDN tiene algunas soluciones mejores: http://social.msdn.microsoft.com/Forums/en-US/wpf/ Tema/a450b0aa-7086-4145-9eff-a779571b6187/ – srgstm