web-dev-qa-db-fra.com

Comment puis-je faire un WPF TextBlock afficher mon texte sur plusieurs lignes?

j'ai une fenêtre wpf où j'ai un panneau de pile avec deux fenêtres dedans - chaque fenêtre avec un bloc de texte dedans.

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

Ce que j'aimerais réaliser, c'est que le bloc de texte supérieur est l'en-tête avec un texte plus gros. Le deuxième bloc de texte est le sous-titre avec un texte plus petit. Peu importe la quantité de texte pour l'en-tête ou le sous-en-tête, la police doit devenir dynamique plus petite/plus grande. Mon problème est que je voudrais que la sous-position soit à largeur fixe. Cela signifie que la police doit correspondre à un pourcentage (70%) de l'en-tête et s'articuler sur plusieurs lignes, selon la quantité de texte dont je dispose. J'ai joint le code que j'ai jusqu'à présent ... je manque quelque chose avec cette sous-position, je ne peux pas comprendre quoi. À votre santé

Edit Fondamentalement, ce que je veux réaliser, c'est que l'en-tête secondaire enveloppe le texte afin qu'il puisse le développer vers le bas avec la police représentant 70% de l'en-tête - quelle que soit la taille de cette police.

39
Brian Hvarregaard

L'imbrication d'un panneau de pile entraînera l'enveloppement correct de la zone de texte:

<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
Brian Hvarregaard

Utilisez la propriété TextWrapping de l'élément TextBlock:

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

Utilisez Linebreak:

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

Reportez-vous à ceci: https://social.msdn.Microsoft.com/Forums/vstudio/en-US/51a3ffe4-ec82-404a-9a99-6672f2a6842b/how-to-give-multiline-in-textblock?forum = wpf

Merci,

RDV

12
RDV

Cela arrive à mi-chemin. Il n'y a pas de propriété ActualFontSize mais il y a un ActualHeight et qui serait lié au FontSize. Pour l'instant, cela ne fait que dimensionner le rendu d'origine. Je ne pouvais pas comprendre comment enregistrer le convertisseur comme événement de redimensionnement. En fait, vous devrez peut-être enregistrer FontSize en tant qu'événement de redimensionnement. Veuillez ne pas me marquer pour une réponse incomplète. Je n'ai pas pu mettre d'exemple de code dans un commentaire.

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

Convertisseur

    [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

Si vous voulez simplement que votre police d'en-tête soit un peu plus grande que les autres, vous pouvez utiliser ScaleTransform. vous ne dépendez donc pas de la taille réelle de la police.

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