it-swarm.it

Come posso fare in modo che un TextBlock WPF mostri il mio testo su più righe?

ho una finestra di wpf in cui ho uno stackpanel con due finestre - ogni finestra con un blocco di testo.

<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 ottenere è che il blocco di testo in alto è l'intestazione con un testo più grande. Il secondo blocco di testo è l'intestazione secondaria con un testo più piccolo. Indipendentemente dalla quantità di testo disponibile per l'intestazione o per il sottotitolo, il carattere deve diventare dinamico sempre più piccolo. Il mio problema è che vorrei che la sottovoce avesse una larghezza fissa. Ciò significa che, il carattere dovrebbe essere una percentuale (70%) dell'intestazione e andare a capo su più righe, a seconda della quantità di testo che ho. Ho allegato il codice che ho finora ... mi manca qualcosa con quella sottovoce, non riesco a capire cosa. Saluti

Modifica Fondamentalmente quello che voglio ottenere è che l'intestazione secondaria avvolga il testo in modo che possa espanderlo verso il basso con il carattere che rappresenta il 70% dell'intestazione, non importa quanto sia grande quel carattere.

39

L'annidamento di uno stackpanel farà avvolgere correttamente la casella di testo:

<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>
71

Utilizzare la proprietà TextWrapping dell'elemento TextBlock:

<TextBlock Text="StackOverflow Forum"
           Width="100"
           TextWrapping="WrapWithOverflow"/>
32
Tonatio

Usa interruzione di riga:

<TextBlock>
        <Run Text="Line1"/>
        <LineBreak/>
        <Run Text="Line2" FontStyle="Italic" FontSize="9"/>
        <LineBreak/>
        <Run Text="Line3"/>
    </TextBlock>

Fare riferimento a questo: https://social.msdn.Microsoft.com/Forums/vstudio/en-US/51a3ffe4-ec82-404a-9a99-6672f2a6842b/how-to-give-multiline-in-textblock?forum = WPF

Grazie,

RDV

12
RDV

Questo arriva in parte lì. Non esiste una proprietà ActualFontSize ma esiste un ActualHeight e che sarebbe correlato a FontSize. In questo momento questo solo dimensioni per il rendering originale. Non sono riuscito a capire come registrare il convertitore come evento di ridimensionamento. In realtà potrebbe essere necessario registrare FontSize come evento di ridimensionamento. Per favore, non contrassegnarmi 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();
        }
    } 
3
paparazzo

Se vuoi solo avere il tuo carattere di intestazione un po 'più grande del resto, puoi usare ScaleTransform. quindi non dipendi dalla dimensione del carattere reale.

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