web-dev-qa-db-fra.com

Redimensionnement de la police WPF TextBlock pour remplir l'espace disponible dans une grille

J'ai du texte qui s'affiche au moment de l'exécution dans un bloc de texte. Je veux que la taille de police soit la plus grande possible pour remplir la zone indiquée. Je pense avoir correctement configuré le bloc de texte pour "redimensionner automatiquement" et j'essaie d'augmenter la taille de la police jusqu'à ce que le bloc de texte soit plus grand que son parent, puis de diminuer la taille de la police de 1. Le problème est que je ne peux pas obtenir le contrôle pour redessiner/recalculer sa taille.

Est-ce la meilleure façon de le faire? Ou existe-t-il un moyen de faire fonctionner ma méthode?

49
Nate Zaugg

Enveloppez le TextBlock dans un ViewBox:

   <Grid>
    <Viewbox>
        <TextBlock TextWrapping="Wrap" Text="Some Text" />
    </Viewbox>
   </Grid>
70
Jobi Joy

J'ai eu le même problème. Vous pouvez l'utiliser pour redimensionner le taille de police du bloc de texte pour remplir la zone quand il a débordement.


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

27
alireza alimardan

J'ai trouvé un excellent moyen de le faire en utilisant 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>
8
Nate Zaugg

Le contrôle WPF ViewBox peut augmenter/diminuer avec son contenu à l'espace disponible.

Placez simplement votre TextBlock dans un ViewBox as;

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

ViewBox est généralement mis à l'échelle par son conteneur.

7
Sajin

Eh bien, ce n'est pas une réponse "parfaite", mais c'est un hack rapide (vous pouvez le déposer dans kaxaml et le tester):

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

ViewBox agrandira tout contenu pour remplir son conteneur. Le problème est que le TextBlock, alors qu'il taille à son texte, a un rembourrage en haut et en bas dont vous ne pouvez pas vous débarrasser (sans faire de gros travaux). Cela pourrait vous rapprocher de ce que vous voulez, tho.

3
Will

Pour garantir l'habillage, vous devez définir le MaxWidth et/ou MaxHeight du 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."/>
2
reti