Подтвердить что ты не робот

Как сделать WPF TextBlock показать мой текст на нескольких строках?

У меня есть wpf-окно, в котором у меня есть панель стека с двумя видовыми экранами в нем - каждый Viewport с текстовым блоком в нем.

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

То, что я хотел бы достичь, - это то, что верхний текстовый блок является заголовком с большим текстом. Второй текстовый блок - это подзаголовок с меньшим текстом. Независимо от того, сколько текста есть для заголовка или подзаголовка, шрифт должен динамически уменьшаться/увеличиваться. Моя проблема в том, что я хотел бы, чтобы подзаголовок был фиксированной шириной. Это означает, что шрифт должен составлять процент (70%) заголовка и переносить на несколько строк, в зависимости от того, сколько текста у меня есть. Я приложил код, который у меня есть до сих пор... я что-то пропустил с этой подзаголовкой, не могу понять, что. Приветствия

Edit В основном, я хочу добиться того, что заголовок заголовка обертывает текст, чтобы он мог развернуть его вниз, при этом шрифт составлял 70% от заголовка - независимо от того, насколько большой шрифт.

4b9b3361

Ответ 1

Вложение в стеке панели приведет к правильному обложению текстового поля:

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

Ответ 2

Используйте свойство TextWrapping элемента TextBlock:

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

Ответ 3

Это происходит частично. Нет свойства ActualFontSize, но есть ActualHeight, и это будет относиться к FontSize. Прямо сейчас это только размеры для оригинального рендера. Я не мог понять, как зарегистрировать конвертер как событие изменения размера. На самом деле, возможно, нужно зарегистрировать FontSize как событие изменения размера. Пожалуйста, не помечайте меня за неполный ответ. Я не мог поместить образец кода в комментарий.

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

Преобразователь

    [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();
        }
    } 

Ответ 4

Если вы просто хотите, чтобы ваш шрифт заголовка немного больше, а остальное, вы можете использовать ScaleTransform. поэтому вы не зависите от реального шрифта.

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