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 поразительно мощная.Узнать его.Не боритесь с этим, используя жестко запрограммированные макеты, а затем жалуйтесь, что ваши жестко запрограммированные макеты - отстой.