Изменить размер шрифта, если текст превышает границу Textblock - PullRequest
7 голосов
/ 18 августа 2011

У меня есть текстовый блок с размером Width = 511, Height = 159.FontSize = 28.Я хочу изменить размер шрифта, если текст превышает размер текстового блока, чтобы весь текст отображался.Есть ли способ сделать это?Формула может быть?

Ответы [ 5 ]

2 голосов
/ 18 августа 2011

Это решение подразумевает использование ViewBox, я думаю, что с функциями преобразования Wpf нет необходимости изменять размер шрифта текста, почти тот же результат может быть заархивирован с помощью преобразования (и в данном случае ViewBox).

Вместо размещения вашего TextBlock внутри ViewBox, измените его шаблон и поместите элемент управления, где текст появляется внутри ViewBox, что-то вроде:

<ControlTemplate TargetType="{x:Type TextBox}">                     
    <Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true">
        <Viewbox HorizontalAlignment="Left">
            <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
        </Viewbox>
    </Microsoft_Windows_Themes:ListBoxChrome>

    <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

Теперь вы получаете элемент управления, который изменяет размер текста в соответствии с доступным пространством, благодаря WPF.

Также вот пример

text example

0 голосов
/ 18 августа 2011

Редактировать: я должен посмотреть на теги перед публикацией. Понятия не имею, что может предложить WPF для решения этой проблемы.

У меня нет никаких доказательств, подтверждающих это, но кажется, что (также для шрифтов переменной ширины, по крайней мере, для всех, установленных на моем компьютере):

  • Размер шрифта имеет линейную зависимость с шириной заданной строки
  • Размер шрифта 0 приводит к ширине 0

Это означает, что вы, вероятно, могли бы использовать MeasureString один раз для максимально допустимого размера шрифта, а затем интерполировать, чтобы найти оптимальный размер шрифта.

Хотя на этой "линейной дороге" есть некоторые "пиксельные неровности", так что вы можете быть на расстоянии нескольких пикселей - но это хорошая альтернатива из-за петель измерения.

0 голосов
/ 18 августа 2011

Это зависит от того, какой шрифт вы используете, например, Courier New разработан так, чтобы каждый символ имел одинаковую ширину, поэтому, если вы исследуете, какая ширина на символ, вы можете использовать функцию get length для строки ( давая вам длину в символах) и отсюда рассчитайте ее ширину в пикселях. Если его ширина превышает 511 пикселей, вы соответственно подгоняете размер.

Если вы используете другой шрифт, такой как Arial, вы можете сделать то же самое, и если вы действительно хотите, чтобы он был точным, вы можете сгруппировать алфавит в узкие буквы, такие как «i», «l» и т. Д. И средние буквы, такие как «t и жирные буквы, такие как «о» и заглавные буквы. Затем вы получаете количество узких, средних и жирных букв и рассчитываете размер по этим данным, но лично для меня это слишком.

Надеюсь, это было полезно.

Редактировать: Игнорировать это, я только что прочитал о функции меры строки, это гораздо меньше усилий, чем мое предложение.

0 голосов
/ 18 августа 2011

Вот что я придумал. Убедитесь, что вы обрабатываете размер шрифта -1.0.

      private static double GetFontSize(TextBox textBox)
      {
         double fontSize = textBox.FontSize;
         FormattedText ft = new FormattedText(textBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight,
                                          new Typeface(textBox.FontFamily, textBox.FontStyle, textBox.FontWeight, textBox.FontStretch),
                                          fontSize, textBox.Foreground);
         while (textBox.Width < ft.Width)
         {
            fontSize -= 1;
            if (fontSize < 0) return -1.0;
            ft = new FormattedText(textBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight,
                                                      new Typeface(textBox.FontFamily, textBox.FontStyle, textBox.FontWeight, textBox.FontStretch),
                                                      fontSize, textBox.Foreground);
         }

         return fontSize;
      }
0 голосов
/ 18 августа 2011

Я не совсем уверен насчет WPF, но в WinForms вы можете использовать метод MeasureString для измерения размеров строк в заданном шрифте.Таким образом, всякий раз, когда содержимое текстового блока изменяется, вам просто нужно использовать этот метод, и если размеры текста больше, чем размеры текстового блока - уменьшите размер шрифта и измерьте снова.

(теперь, после того как я написал это, я думаю, что для этого должен быть более простой метод)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...