2010-02-17 8 views
45

Mam trochę tekstu, który jest wyświetlany w czasie wykonywania w bloku tekstowym. Chcę, aby rozmiar czcionki był największy, aby wypełnić obszar podany jako . Myślę, że poprawnie skonfigurowałem textblock do "autosize" i Próbuję zwiększyć rozmiar czcionki, aż blok tekstu będzie większy niż jej rodzic, a następnie zmniejszy rozmiar czcionki o 1. Problem polega na tym, że nie mogę uzyskać uzyskać kontroli przerysowywać/przeliczać jego rozmiar.WPF TextBlock zmienia rozmiar czcionki, aby wypełnić dostępne miejsce w siatce

Czy jest to lepszy sposób na zrobienie tego? Czy jest jakiś sposób, aby moja metoda zadziałała?

Odpowiedz

58

Owiń TextBlock Wewnątrz ViewBox:

<Grid> 
    <Viewbox> 
     <TextBlock TextWrapping="Wrap" Text="Some Text" /> 
    </Viewbox> 
    </Grid> 
+3

To wypełnienie wszystkich poziomą przestrzeń ... ale jak zrobić to samo również dla pionowej przestrzeni? Nie mogę zawinąć tekstu bloku tekstowego, dopóki nie uzyska bardzo małego rozmiaru czcionki. – Tobia

+2

Nie działa dla mnie. – TarmoPikaro

+0

Doprowadziło to do rozciągnięcia tekstu na wysokość obszaru, w którym się znajdował; co sprawia, że ​​jest OGROMNY. I owijka nigdy go nie kopnęła, nadal płynęła z prawej krawędzi mojej kontroli. – BrainSlugs83

6

Znalazłem świetny sposób, aby to zrobić przy użyciu 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> 
+0

1 minuta za późno. : ^) – Conrad

3

Cóż, to nie jest "doskonały" odpowiedź, ale jest to szybki hack (możesz upuścić to na kaxaml i przetestować):

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

The ViewBox powiększy dowolną treść, aby wypełnić swój kontener. Problem polega na tym, że TextBlock, gdy rozmiar tekstu jest taki sam, ma wypełnienie u góry i dołu, którego nie można się pozbyć (bez wykonywania ciężkiego podnoszenia). To może zbliżyć cię do tego, czego chcesz, tho.

18

Miałem ten sam problem. Można to wykorzystać do rozmiarufontsize z textblock aby wypełnić obszar gdy ma przepełnienie.


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

+2

Wow, spędziłem godziny próbując znaleźć rozwiązanie podobnego problemu za pomocą metody Measure i Width, ActualWidth, RenderWidth, ale nic nie działało ahahahahahahah Nigdy bym nie odkrył własności "DownOnly", dziękuję! :) – Sergio0694

5

Kontrola WPF ViewBox mogą rosnąć/kurczyć wraz z jej zawartością do dostępnej przestrzeni.

Po prostu umieść swój TextBlock w postaci ViewBox jako;

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

ViewBox jest zwykle skalowany przez jego kontener.

3

Aby zapewnić opakowanie, trzeba ustawić MaxWidth i/lub MaxHeight o 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."/> 

Powiązane problemy