Как сделать так, чтобы текстовый блок WPF показывал мой текст в несколько строк? - PullRequest
38 голосов
/ 13 сентября 2011

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

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

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

Ответы [ 5 ]

70 голосов
/ 14 сентября 2011

При вложении стековой панели текстовое поле будет переноситься правильно:

<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>
31 голосов
/ 18 октября 2015

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

<TextBlock Text="StackOverflow Forum"
           Width="100"
           TextWrapping="WrapWithOverflow"/>
11 голосов
/ 08 августа 2018

Использовать перевод строки:

<TextBlock>
        <Run Text="Line1"/>
        <LineBreak/>
        <Run Text="Line2" FontStyle="Italic" FontSize="9"/>
        <LineBreak/>
        <Run Text="Line3"/>
    </TextBlock>

См. Это: https://social.msdn.microsoft.com/Forums/vstudio/en-US/51a3ffe4-ec82-404a-9a99-6672f2a6842b/how-to-give-multiline-in-textblock?forum=wpf

Спасибо

RDV

3 голосов
/ 14 сентября 2011

Это часть пути туда.Свойство 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();
        }
    } 
2 голосов
/ 14 сентября 2011

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

 <TextBlock x:Name="headerText" Text="Lorem ipsum dolor">
                <TextBlock.LayoutTransform>
                    <ScaleTransform ScaleX="1.1" ScaleY="1.1" />
                </TextBlock.LayoutTransform>
  </TextBlock>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...