2011-09-13 12 views
27

Ho una finestra wpf in cui ho uno stackpanel con due viewport in esso - ogni Viewport con un blocco di testo.Come faccio a far sì che un TextBlock WPF mostri il mio testo su più righe?

<Grid> 
    <StackPanel VerticalAlignment="Center" Orientation="Vertical" > 
     <Viewbox Margin="100,0,100,0"> 
      <TextBlock x:Name="headerText" Text="Lorem ipsum dolor" Foreground="Black"/> 
     </Viewbox> 
     <Viewbox Margin="150,0,150,0"> 
      <TextBlock x:Name="subHeaderText" Text="Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, " TextWrapping="Wrap" Foreground="Gray" /> 
     </Viewbox> 
    </StackPanel> 
</Grid> 

Quello che vorrei realizzare è che il blocco di testo in alto è il titolo con un testo più grande. Il secondo blocco di testo è l'intestazione secondaria con un testo più piccolo. Non importa quanto testo ci sia per l'intestazione o il sottotitolo, il carattere dovrebbe diventare dinamico più piccolo/più grande. Il mio problema è che vorrei che il sottotitolo fosse a larghezza fissa. Ciò significa che, il carattere dovrebbe essere una percentuale (70%) dell'intestazione e avvolgere su più righe, a seconda di quanto testo ho. Ho allegato il codice che ho finora ... mi manca qualcosa con quel sottotitolo, non riesco a capire cosa. Acclamazioni

Modifica Fondamentalmente quello che voglio ottenere è che l'intestazione sub avvolge il testo in modo che possa espandersi verso il basso con il tipo di carattere di essere un 70% della voce - non importa quanto grande, che carattere è.

+0

Qual è la regola/equazione per il dimensionamento dinamico. OK il sub è il 70% ma come dimensionare il primo? Se vuoi una larghezza fissa per il secondo TextBlock, imposta la larghezza. – Paparazzi

+0

Questo è per l'uso in un ambiente in cui non conosco le dimensioni/risoluzione dello schermo. Quindi la larghezza è impostata usando i margini, permettendomi così di comportarmi allo stesso modo su tutti gli schermi. La dimensione dell'intestazione è determinata dal viewport, ciò significa che il blocco di testo viene sempre mostrato nella dimensione massima. - di nuovo a seconda della risoluzione dello schermo. –

risposta

56

Nidificazione uno StackPanel farà sì che la casella di testo per avvolgere correttamente:

<Viewbox Margin="120,0,120,0"> 
    <StackPanel Orientation="Vertical" Width="400"> 
     <TextBlock x:Name="subHeaderText" 
        FontSize="20" 
        TextWrapping="Wrap" 
        Foreground="Black" 
        Text="Lorem ipsum dolor, lorem isum dolor,Lorem ipsum dolor sit amet, lorem ipsum dolor sit amet " /> 
    </StackPanel> 
</Viewbox> 
+6

Questo risolve il tuo problema? Una larghezza fissa e una dimensione frontale fissa sembrano incoerenti con l'affermazione del problema. – Paparazzi

+1

@Blam: è possibile utilizzare MaxWidth se si desidera che il testo si completi, ma non si desidera uno spazio eccessivo se è inferiore alla larghezza. – Robotnik

3

Questo diventa così parte lì. Non esiste una proprietà ActualFontSize ma esiste un ActualHeight che si riferisce a FontSize. In questo momento questa unica dimensione per il rendering originale. Non riuscivo a capire come registrare il convertitore come evento di ridimensionamento. In realtà forse è necessario registrare FontSize come evento di ridimensionamento. Per favore non segnarmi per una risposta incompleta. Non ho potuto inserire un esempio di codice in un commento.

<Window.Resources> 
     <local:WidthConverter x:Key="widthConverter"/> 
    </Window.Resources> 
    <Grid> 
     <Grid> 
      <StackPanel VerticalAlignment="Center" Orientation="Vertical" > 
       <Viewbox Margin="100,0,100,0"> 
        <TextBlock x:Name="headerText" Text="Lorem ipsum dolor" Foreground="Black"/> 
       </Viewbox> 
       <TextBlock Margin="150,0,150,0" FontSize="{Binding ElementName=headerText, Path=ActualHeight, Converter={StaticResource widthConverter}}" x:Name="subHeaderText" Text="Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, " TextWrapping="Wrap" Foreground="Gray" /> 
      </StackPanel> 
     </Grid> 
    </Grid>   

Converter

[ValueConversion(typeof(double), typeof(double))] 
    public class WidthConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      double width = (double)value*.7; 
      return width; // columnsCount; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
2

Se si vuole solo avere il carattere di testa un po 'più grande poi il resto, è possibile utilizzare ScaleTransform. in modo da non dipendere dal tipo di carattere reale.

<TextBlock x:Name="headerText" Text="Lorem ipsum dolor"> 
       <TextBlock.LayoutTransform> 
        <ScaleTransform ScaleX="1.1" ScaleY="1.1" /> 
       </TextBlock.LayoutTransform> 
    </TextBlock> 
20

utilizzare la proprietà TextWrapping dell'elemento TextBlock:

<TextBlock Text="StackOverflow Forum" 
      Width="100" 
      TextWrapping="WrapWithOverflow"/> 
+1

Questa è la mia risposta. grazie. –

Problemi correlati