2010-02-17 37 views
45

Tôi có một số văn bản được hiển thị tại thời gian chạy trong một khối chữ. Tôi muốn kích thước phông chữ là kích thước phông chữ lớn nhất có thể để lấp đầy khu vực được cho là . Tôi nghĩ rằng tôi có thiết lập textblock chính xác để "tự động" và Tôi cố gắng tăng kích thước phông chữ cho đến khi khối chữ lớn hơn cha mẹ của nó sau đó giảm kích thước phông chữ xuống 1. Vấn đề là tôi không thể lấy điều khiển vẽ lại/recompute kích thước của nó.Thay đổi kích thước phông chữ WPF TextBlock để lấp đầy khoảng trống có sẵn trong một Lưới

Có phải cách tốt hơn để làm điều đó không? Hoặc có cách nào tôi có thể làm cho phương pháp của tôi hoạt động không?

Trả lời

58

TextBlock bên trong một ViewBox:

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

điền này tất cả các không gian ngang ... nhưng làm thế nào để làm điều tương tự cũng cho không gian dọc? Tôi không thể bọc văn bản textblock cho đến khi nó có kích thước phông chữ rất nhỏ. – Tobia

+2

Đã không làm việc cho tôi. – TarmoPikaro

+0

Điều này chỉ làm cho văn bản kéo dài đến độ cao của khu vực mà nó đã ở; làm cho nó kết thúc là HUGE. Và cái gói không bao giờ đá nó, nó tiếp tục chảy ra khỏi mép phải của điều khiển của tôi. – BrainSlugs83

6

Tôi tìm thấy một cách tuyệt vời để làm điều này bằng 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 phút quá muộn. : ^) – Conrad

3

Vâng, nó không phải là một câu trả lời "hoàn hảo", nhưng đây là một nhanh chóng hack (bạn có thể thả này vào kaxaml và kiểm tra nó ra):

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

Các ViewBox sẽ phóng to bất kỳ nội dung để điền vào container của nó. Vấn đề là các TextBlock, trong khi nó có kích thước văn bản của nó, có đệm ở phía trên và phía dưới mà bạn không thể thoát khỏi (mà không làm một số nâng nặng). Điều này có thể giúp bạn gần gũi hơn với những gì bạn muốn, tho.

18

Tôi gặp vấn đề tương tự. Bạn có thể sử dụng điều này để thay đổi kích thước các phông chữ của mã vạch để lấp đầy khu vực khi có tràn.


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

+2

Wow, tôi đã dành hàng giờ cố gắng tìm một giải pháp cho một vấn đề tương tự bằng cách sử dụng phương pháp Measure và Width, ActualWidth, RenderWidth, nhưng không có gì làm việc ahahahahahahah Tôi chưa bao giờ phát hiện ra thuộc tính "DownOnly", cảm ơn bạn! :) – Sergio0694

5

Việc kiểm soát WPF ViewBox có thể phát triển/thu nhỏ với nội dung của nó để không gian có sẵn.

Chỉ cần đặt TextBlock của bạn trong một số ViewBox dưới dạng;

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

ViewBox thường được chia tỷ lệ theo vùng chứa.

3

Để đảm bảo bao bì, bạn cần phải thiết lập các MaxWidth và/hoặc MaxHeight của 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."/> 

Các vấn đề liên quan