2011-08-18 12 views
7

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

+0

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

+2

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

+0

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ò. –

risposta

0

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)

0

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.

0

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; 
     } 
0

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.

2

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

text example

Problemi correlati