Ho un blocco di testo con una dimensione di Larghezza = 511, Altezza = 159. FontSize = 28. Voglio cambiare la dimensione del carattere se il testo supera la dimensione del blocco di testo in modo che venga visualizzato tutto il testo. C'è un modo per farlo? Una formula forse?Modifica la dimensione del carattere se il testo supera il limite di Textblock
risposta
Non sono sicuro di WPF, ma in WinForms è possibile utilizzare il metodo MeasureString per misurare le dimensioni delle stringhe in un determinato font. Pertanto, ogni volta che il contenuto del blocco di testo cambia, è sufficiente utilizzare questo metodo e se le dimensioni del testo sono più grandi delle dimensioni del blocco di testo, ridurre la dimensione del carattere e misurare nuovamente.
(ora, dopo che ho scritto questo, penso che ci dovrebbe essere un metodo più semplice per questo)
Dipende da quello che tipo di carattere utilizzato, per esempio, Courier New è progettato per avere ogni carattere della stessa larghezza, quindi se fai delle ricerche su quale sia la larghezza per carattere puoi usare la funzione get length per la stringa (dandoti la lunghezza in caratteri) e da lì calcolare la sua larghezza in pixel. Se la sua larghezza supera 511px, la dimensione viene regolata di conseguenza.
Se si utilizza un carattere diverso come Arial, è possibile fare lo stesso e se si desidera veramente accurato, è possibile raggruppare l'alfabeto in lettere strette, come "i", "l" ecc. E lettere medie come " t 'e lettere grasse come' o 'e le maiuscole. Quindi ottieni il numero di lettere strette, medie e grasse e calcoli le dimensioni da quei dati, ma personalmente, è troppo per me.
Spero che questo sia stato utile.
Modifica: ignorare questo, ho appena letto sulla funzione measurestring, è uno sforzo molto più piccolo del mio suggerimento.
Ecco cosa mi è venuto in mente. Assicurati di gestire la dimensione del carattere -1.0.
private static double GetFontSize(TextBox textBox)
{
double fontSize = textBox.FontSize;
FormattedText ft = new FormattedText(textBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight,
new Typeface(textBox.FontFamily, textBox.FontStyle, textBox.FontWeight, textBox.FontStretch),
fontSize, textBox.Foreground);
while (textBox.Width < ft.Width)
{
fontSize -= 1;
if (fontSize < 0) return -1.0;
ft = new FormattedText(textBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight,
new Typeface(textBox.FontFamily, textBox.FontStyle, textBox.FontWeight, textBox.FontStretch),
fontSize, textBox.Foreground);
}
return fontSize;
}
Modifica: dovrei esaminare i tag prima di pubblicare. Nessun indizio su cosa potrebbe offrire WPF per risolvere questo problema.
Non ho alcuna prova a sostegno di questo, ma sembra che (anche per i font a larghezza variabile, almeno tutti quelli installati sulla mia macchina):
- dimensione dei caratteri è lineare rapporto con la larghezza di una data stringa
- dimensione dei caratteri 0 risultati in una larghezza di 0
Questo significa che si potrebbe forse usare MeasureString
una volta il più grande dimensione del carattere permesso, e quindi interpolare per trovare la dimensione ottimale dei caratteri .
Ci sono alcuni "picchi di pixel" su quella "strada lineare", quindi potresti essere un po 'spenta, ma è una buona alternativa ai loop di misura.
Questa soluzione implica l'utilizzo di un ViewBox, penso che con le funzionalità di trasformazione di Wpf non è necessario modificare la dimensione del carattere del testo, Quasi lo stesso risultato può essere ottenuto utilizzando la trasformazione (e un ViewBox in questo caso) .
Invece di mettere il vostro TextBlock all'interno di un Viewbox, modificare è modello e mettere il controllo in cui il testo appare all'interno di una Viewbox, qualcosa come:
<ControlTemplate TargetType="{x:Type TextBox}">
<Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true">
<Viewbox HorizontalAlignment="Left">
<ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Viewbox>
</Microsoft_Windows_Themes:ListBoxChrome>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
Ora si ottiene un controllo che dimensioni è il testo per adattarsi lo spacee disponibile, grazie WPF.
qui anche qualche esempio
- 1. scoprire se il testo di JLabel supera la dimensione dell'etichetta
- 2. Git lfs - "questo supera il limite di dimensione del file di GitHub di 100,00 MB"
- 3. Come simulare la memoria esaurita: la dimensione dell'array richiesto supera il limite della VM
- 4. Il file di log di sviluppo supera il limite di dimensione del file di GitHub, anche dopo l'eliminazione del file
- 5. Modifica la dimensione del carattere per un messaggio di AlertDialog
- 6. Come impostare la dimensione del carattere del testo in Unity?
- 7. Modifica solo la dimensione del carattere in SWT
- 8. Come si modifica facilmente la dimensione del carattere in spacemacs?
- 9. java.lang.OutOfMemoryError: dimensione bitmap supera il budget VM
- 10. Come modificare il carattere e la dimensione del carattere di un tag di input HTML?
- 11. Come si modifica la dimensione del carattere in HTML/css senza che la dimensione div cambi?
- 12. UITextField cambia il carattere durante la modifica
- 13. Perdite di memoria Symfony2 Doctrine2/supera il limite di memoria
- 14. Modifica dimensione carattere terminale con C++
- 15. come risolvere la dimensione del testo di modifica multilinea
- 16. Modifica la dimensione del carattere XTerm predefinito in Cygwin
- 17. Come posso determinare se il mio testo TextBlock viene tagliato?
- 18. CATextLayer ignora la dimensione del carattere
- 19. dimensione della matrice e la dimensione del puntatore carattere carattere
- 20. La proprietà di testo "Dimensione carattere" di Mayavi funziona?
- 21. R Markdown - modifica della dimensione del carattere e del tipo di carattere nell'output html
- 22. cambia la dimensione del carattere testo dell'intero contenuto della pagina
- 23. Ridimensiona la dimensione del carattere in UITextView
- 24. Modifica della dimensione del carattere del codice in WebStorm ID
- 25. Come impostare la dimensione del carattere per il testo dei pulsanti di dialogo
- 26. Swift - Modifica della dimensione del carattere all'interno dell'etichetta
- 27. Modifica dell'allineamento del testo delle celle dell'intestazione DataGridView e dimensione del carattere
- 28. Modifica della dimensione del carattere in una AlertDialog
- 29. gridExtra 2.0.0 modifica la dimensione del titolo
- 30. rileva la dimensione del carattere del browser
Non voglio usare Viewbox perché ingrandisce il blocco di testo rendendo la larghezza minore. Voglio mantenere la dimensione del blocco di testo e modificare semplicemente la dimensione del carattere. – patlimosnero
Ecco un post simile che utilizza TextRenderer.MeasureText: http://stackoverflow.com/questions/1453327/relation-between-length-and-font-size-of-a-string-and-width-of-a-textbox. Mi chiedo se esiste un modo per adattarlo retroattivamente a un rapporto dimensione carattere? – Josh
Se sposti TextBlock in ScrollViewer e gestisci un evento quando la barra di scorrimento orizzontale sta per apparire. Quindi puoi ridimensionare il carattere e cancellare la barra di scorrimento che appare. In teoria ... non ho ancora verificato se è possibile, ma lo farò. –