2010-02-17 3 views
45

Ho un testo che viene visualizzato in fase di esecuzione in un blocco di testo. Voglio la dimensione del carattere per essere il più grande che può essere per riempire l'area che è data . Penso di avere l'impostazione di blocco testo corretta per "autosize" e Provo ad aumentare la dimensione del carattere fino a quando il blocco di testo è maggiore di suo padre quindi diminuire la dimensione del carattere di 1. Il problema è che non posso ottenere il controllo per ridisegnare/ricalcolare le sue dimensioni.WPF TextBlock carattere ridimensionare per riempire lo spazio disponibile in una griglia

È il modo migliore per farlo? O c'è un modo per far funzionare il mio metodo?

risposta

58

Avvolgere il TextBlock all'interno di un ViewBox:

<Grid> 
    <Viewbox> 
     <TextBlock TextWrapping="Wrap" Text="Some Text" /> 
    </Viewbox> 
    </Grid> 
+3

Questa riempire tutto lo spazio orizzontale ... ma come fare lo stesso anche per lo spazio in verticale? Non riesco a racchiudere il testo del blocco di testo finché non ottiene una dimensione del carattere molto piccola. – Tobia

+2

Non ha funzionato per me. – TarmoPikaro

+0

Questo ha solo allungato il testo fino all'altezza dell'area in cui si trovava; facendolo diventare ENORME. E l'involucro non l'ha mai calciato, ha continuato a fluire dal margine destro del mio controllo. – BrainSlugs83

6

ho trovato un ottimo modo per farlo usando ViewBox:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="50" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="100" /> 
    </Grid.ColumnDefinitions> 
    <Viewbox Grid.Row="0" Grid.Column="0" Stretch="Uniform"> 
     <TextBlock Name="tbTest" Background="Yellow" Text="This is some text" />  
    </Viewbox> 

    <ContentControl Grid.Column="0" Grid.Row="2"> 
     <TextBlock>This is some text</TextBlock> 
    </ContentControl> 
</Grid> 
+0

1 minuto troppo tardi. : ^) – Conrad

3

Beh, la sua non è una risposta "perfetta", ma questo è un trucco rapido (puoi rilasciarlo in kaxaml e provarlo):

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid Height="300" Background="green"> 
    <Viewbox> 
    <TextBlock Background="red" Text="Hurr"/> 
    </Viewbox> 
    </Grid> 
</Page> 

Il ViewBox ingrandirà qualsiasi contenuto per riempire il suo contenitore. Il problema è che il TextBlock, mentre si dimensiona sul suo testo, ha un riempimento nella parte superiore e inferiore che non è possibile eliminare (senza fare un po 'di sollevamento). Questo potrebbe farti avvicinare a quello che vuoi, tho.

18

Ho avuto lo stesso problema. È possibile utilizzare questo per ridimensionare il fontsize del blocco di testo per riempire l'area quando ha trabocco.


<Viewbox StretchDirection="DownOnly" Stretch="Uniform"> 
    <TextBlock Text="{Binding Path=Title}" HorizontalAlignment="Center"/> 
</Viewbox> 

+2

Wow, ho passato ore a cercare una soluzione a un problema simile usando il metodo Measure e Width, ActualWidth, RenderWidth, ma niente ha funzionato ahahahahahahah Non avrei mai scoperto la proprietà "DownOnly", grazie! :) – Sergio0694

5

Il controllo WPF ViewBox può crescere/ridursi con il suo contenuto allo spazio disponibile.

Basta inserire il numero TextBlock in un ViewBox come;

<Viewbox Stretch="Uniform" Width="50" Height="50"> 
    <TextBlock Text="Test" /> 
</Viewbox> 

ViewBox viene generalmente ridimensionato dal relativo contenitore.

3

Per garantire il confezionamento, è necessario impostare il MaxWidth e/o MaxHeight del TextBlock

<Viewbox StretchDirection="DownOnly" Stretch="Uniform"> 
     <TextBlock MaxWidth="500" TextWrapping="Wrap" FontSize="30" VerticalAlignment="Center" 
        Text="Lorem ipsum dolor sit amet, consectetur adipiscing 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."/>