Как масштабировать форму с размером шрифта в WPF? - PullRequest
6 голосов
/ 04 марта 2012

Как я могу масштабировать форму со шрифтом в WPF?

т.е. что такое эквивалент WPF

this.Font = SystemFonts.IconTitleFont;

В WinForms, если выВы хороший разработчик, вы уважаете настройки шрифтов пользователя.WinForm, который начинается с:

enter image description here

Затем вы применяете настройки шрифта пользователя:

this.Font = new Font("Segoe Print", 11, GraphicsUnit.Point);

и элементы формы масштаб для размещения нового размера:

enter image description here

Примечание:

  • форма шире и выше
  • этикетка расположена ниже, а справа
  • этикетка шире и выше
  • текст этикетки не обрезан справа или по нижнему краю
  • кнопка шире и выше
  • , но кнопка расположена дальше вниз и вправо

Примечание : в WinForms вы можететакже используйте строку:

this.Font = SystemFonts.IconTitleFont;

WPF не поддерживает Font, поэтому я предоставил более четкую альтернативу.Для приведенного ниже примера.

Аналогичная форма WPF начинается с:

enter image description here

Затем вы применяете настройки шрифта пользователя с помощью:

        this.FontFamily = new FontFamily("Segoe Print");
        this.FontSize = 14.666; //11pt = 14.66

и элементы формы не масштабируются для размещения нового размера:

enter image description here

Примечание:

  • положение метки не изменилось
  • положение кнопки не изменилось
  • форма не шире и не выше (текст обрезан)
  • метка не какая-либошире (текст обрезан справа)
  • метка не выше (обрезка текста вдоль нижнего края)
  • кнопка не шире (текст обрезан)

Вот еще один пример двух кнопок одинакового размера :

WinForms:

enter image description here

Windows Presentation Foundation:

enter image description here

Бонусное чтение

1 Ответ

11 голосов
/ 05 марта 2012

WPF не выполняет примитивное масштабирование на основе шрифтов, потому что ... ну, примитивно.Вы можете увидеть его на своих скриншотах.

Вот ваш скриншот "WinForms, перед изменением шрифта".Посмотрите, сколько места находится между «сидел на бревне».и правый край формы.

И вот ваш скриншот "WinForms, после изменения шрифта".Обратите внимание, насколько меньше отступов после «масштабирования».

Если бы вы не оставили все это дополнительное пространство, тогда ваш ярлык будет обрезан новым шрифтом.А с некоторыми шрифтами он будет обрезан, даже если вы действительно оставите все это дополнительное пространство.Вот что я имею в виду, когда говорю, что масштабирование WinForms является «примитивным».WinForms выбирает единую шкалу для применения ко всему, и эта шкала не выбирается при любой осведомленности о вашем контенте;он основан на средней статистике для шрифта, которая может и развалится, когда вы начнете говорить о специфике.

WPF не мешает вам чем-то таким примитивным.Это дает вам удивительно мощную систему компоновки, в которой было бы тривиально создать красиво масштабируемое окно.Но вместо этого вы решаете нанести вред этой системе макетов, используя жестко закодированные размеры. Остановите это.

У жестко запрограммированных размеров есть две огромные проблемы:

  • Они не адаптируются к разным шрифтам.Вы уже это заметили.
  • Они не адаптируются к другому контенту.(Что происходит, когда вы хотите сделать немецкую версию своего приложения, а текст на немецком языке не вписывается в размер ваших жестко запрограммированных кнопок?)

Размеры в жестком коде просто надевайте к чему угодно. Вы должны были использовать их в WinForms, потому что это все поддерживаемые WinForms.Но WPF дает вам правильную систему компоновки, поэтому вам не нужно (и не следует) использовать что-то грубое.

Все, что вам нужно, это:

  • A Window с SizeToContent="WidthAndHeight".Таким образом, окно будет иметь правильный размер для размещения текста и кнопки, независимо от того, какой шрифт или язык вы используете.
  • Поскольку у вас есть только два элемента пользовательского интерфейса, и один находится над другим, вы быпоместите StackPanel внутри вашего Window.
  • Внутри StackPanel вам потребуется:
    • A Label или TextBlock, чтобы показать ваш текст, с текстом в Content (Label) или Text (TextBlock);и
    • A Button с HorizontalAlignment="Right" и текстом в Content.
  • Установите Margin s на StackPanel, TextBlock и Button для размещения вещей по своему вкусу.

Вот и все.Не устанавливайте никакие другие свойства на что-либо - , особенно , а не Width или Height.

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

Если вы позже захотите сделать свой макет более продвинутым, вы можете рассмотреть такие вещи, как:

  • Если вы хотите, чтобы кнопкабыть немного шире (чтобы было больше передышки до и после текста), попробуйте поиграть с Padding или установите MinWidth и MinHeight.(Не используйте Width или Height, если ваша кнопка содержит текст. Вы могли бы рассмотреть возможность их использования, если ваша кнопка содержит только изображение, но, возможно, даже тогда.)
  • Если вы обеспокоены тем, что шрифт может сделать окно настолько большим, что оно больше не помещается на экране пользователя, и хотите включить перенос слов, поэкспериментируйте с MaxWidth и TextWrapping.

Система макетов WPF поразительно мощная.Узнать его.Не боритесь с этим, используя жестко запрограммированные макеты, а затем жалуйтесь, что ваши жестко запрограммированные макеты - отстой.

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