Utilizzando WPF, qual è il modo più efficiente per misurare un numero elevato di stringhe corte? In particolare, mi piacerebbe determinare l'altezza di visualizzazione di ogni stringa, data una formattazione uniforme (stesso font, dimensioni, peso, ecc.) E la larghezza massima che la stringa può occupare?Misurazione del testo in WPF
risposta
La tecnica di livello più basso (e quindi la più ampia per le ottimizzazioni creative) è l'utilizzo di GlyphRuns.
Non è molto ben documentato, ma ho scritto un piccolo esempio qui:
http://smellegantcode.wordpress.com/2008/07/03/glyphrun-and-so-forth/
L'esempio funziona la lunghezza della stringa come un passo necessario prima del rendering di esso.
È possibile utilizzare la proprietà DesiredSize su un TextBox reso per ottenere l'altezza e la larghezza
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);
Se si dispone di un gran numero di stringhe può essere più veloce per primo pre-calualte l'altezza e la larghezza di ogni lettera e simbolo indiviudali in un determinato carattere, quindi eseguire un calcolo basato sui caratteri stringa. Questo potrebbe non essere accurato al 100% a causa di kerning ecc.
È molto semplice e fatto dalla classe FormattedText! Provalo.
FormattedText non è disponibile in UniversalWindows, aiutatemi! –
In WPF:
ricordarsi di chiamare Measure() sul TextBlock prima di leggere la proprietà DesiredSize.
Se TextBlock è stato creato on-the-fly, e non ancora mostrato, è necessario chiamare Measure() prima, in questo modo:
MyTextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
return new Size(MyTextBlock.DesiredSize.Width, MyTextBlock.DesiredSize.Height);
In Silverlight:
Non c'è bisogno di misurare.
return new Size(TextBlock.ActualWidth, TextBlock.ActualHeight);
Il codice completo è simile al seguente:
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. misurazione del testo su tela in scala
- 2. Misurazione della larghezza del testo in Qt
- 3. misurazione esatta del tempo
- 4. Misurazione della larghezza del testo da disegnare su Canvas (Android)
- 5. Misurazione dei controlli creati in fase di esecuzione in WPF
- 6. Allineamento verticale del testo in WPF TextBlock
- 7. WPF: Troncamento automatico del testo in TextBlock
- 8. Allineamento del testo in un WPF DataGrid
- 9. Misurazione del livello con AVAudioEngine
- 10. Misurazione del tempo CPU trascorso in Julia
- 11. Misurazione del tempo trascorso in python
- 12. Misurazione del tempo estremamente precisa in C
- 13. Valutazione del rumore/misurazione del rumore nell'immagine
- 14. WPF valore combobox e visualizzazione del testo
- 15. WPF cambiare il margine sinistro del testo
- 16. Misurazione del traffico di rete con Indy
- 17. Strumenti di misurazione del codice validi?
- 18. Come ottenere una misurazione precisa del ping
- 19. Misurazione del runtime di un codice C++?
- 20. Formattazione testo WPF in GridViewColumn
- 21. Impedisci il completamento automatico del testo in WPF ComboBox?
- 22. visualizzazione testo cliccabile WPF
- 23. Misurazione del tempo di esecuzione in C++ Codice OpenMP
- 24. Misurazione del tempo di modifica del rendering avviato da Javascript
- 25. WPF Listview testo vuoto
- 26. Testo WPF Effetto dissolvenza in uscita
- 27. Misurazione di un ViewPager
- 28. Allineamento del testo in DataGrid
- 29. Impostazione testo WPF per TextBlock
- 30. Non è possibile incollare tutto il testo in WPF testo
Stessa domanda sul forum di MSDN ottenuto alcune soluzioni migliori: http://social.msdn.microsoft.com/Forums/en-US/wpf/ thread/a450b0aa-7086-4145-9eff-a779571b6187/ – srgstm