Изменение размера шрифта WPF TextBlock для заполнения доступного пространства в сетке - PullRequest
49 голосов
/ 17 февраля 2010

У меня есть текст, который отображается во время выполнения в текстовом блоке.Я хочу, чтобы размер шрифта был наибольшим, чтобы он мог заполнить заданную область.Я думаю, что у меня правильно настроен текстовый блок на «autosize», и я пытаюсь увеличить размер шрифта до тех пор, пока текстовый блок не станет больше, чем его родитель, а затем уменьшить размер шрифта на 1. Проблема в том, что я не могу заставить элемент управления перерисоватьпересчитать его размер.

Это лучший способ сделать это?Или я могу заставить мой метод работать?

Ответы [ 6 ]

68 голосов
/ 17 февраля 2010

Оберните TextBlock внутри ViewBox:

   <Grid>
    <Viewbox>
        <TextBlock TextWrapping="Wrap" Text="Some Text" />
    </Viewbox>
   </Grid>
27 голосов
/ 18 июля 2012

У меня была такая же проблема. Вы можете использовать это, чтобы изменить размер размер шрифта текстового блока , чтобы заполнить область, когда она имеет переполнение .


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

8 голосов
/ 17 февраля 2010

Я нашел отличный способ сделать это, используя 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>
7 голосов
/ 07 ноября 2012

Элемент управления WPF ViewBox может увеличиваться / уменьшаться с его содержимым до доступного пространства.

Просто поместите ваш TextBlock в ViewBox как;

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

ViewBox обычно масштабируется по контейнеру.

3 голосов
/ 17 февраля 2010

Ну, это не "идеальный" ответ, но это быстрый взлом (вы можете поместить его в kaxaml и проверить его):

<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 увеличит любой контент, чтобы заполнить его контейнер. Проблема в том, что TextBlock, хотя он и масштабируется по своему тексту, имеет отступы сверху и снизу, от которых вы не можете избавиться (не выполняя тяжелой работы). Это может сделать вас ближе к тому, что вы хотите, хотя.

2 голосов
/ 07 августа 2015

Чтобы обеспечить упаковку, вам нужно установить MaxWidth и / или MaxHeight из 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."/>

...