Текст отображается по-разному в окне WPF и внутри ElementHost - PullRequest
12 голосов
/ 13 января 2011

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

    <Label Content="Normal text" Name="labelNormal"/>
    <Label Content="Bold text" Name="labelBold" FontWeight="Bold" />

- вот простые метки в окне WPF:
Окно WPF http://img525.imageshack.us/img525/7049/wpfwindow.png

- и те же метки, которые отображаются приПользовательский элемент управления WPF размещен в WinForms:
WPF Interop http://i51.tinypic.com/14j4xnc.jpg

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

Есть какие-нибудь идеи, как это исправить?

Заранее спасибо!

Ответы [ 2 ]

20 голосов
/ 13 января 2011

(отредактировано 18 января, чтобы добавить, что это не только режим рендеринга шрифта, но и сам шрифт.)

Здесь есть два важных фактора: шрифт и режим форматирования шрифта.

Ваше хост-приложение Windows Forms устанавливает семейство шрифтов по умолчанию «Microsoft Sans Serif» с размером шрифта 8,25pt, который в единицах измерения WPF равен FontSize из 11. Но в WPF обычно используется другой шрифт -Я использую Windows 7 со стандартной темой Aero, а WPF по умолчанию использует пользовательский интерфейс Segoe с FontSize из 12.

Так что самая большая причина, по которой вы видите здесь разные результаты, заключается в том, что это два разных шрифта,Добавление FontFamily="Segoe UI" FontSize="12" к корневому элементу UserControl делает два примера WPF более подходящими для меня.(Но это, конечно, сделает ваш WPF-текст менее согласованным с текстом в содержащем приложении Windows Forms. Именно по этой причине ElementHost распространяет выбор шрифта Windows Forms в содержимое WPF.)

До того, как яотредактировав это, я подумал, что это может быть связано с разницей между режимами Ideal и Display для рендеринга текста WPF.Поняв, что речь идет в основном о шрифте, я больше не думаю, что это так, но я собираюсь оставить обсуждение этой другой проблемы здесь, потому что все еще полезно для любого, кто пытается заставить свой текст WPF выглядеть в соответствии с их WindowsФормы текстовые.По умолчанию для WPF используется Ideal, но если вы работаете в приложении Windows Forms, возможно, Display лучше, потому что это будет выглядеть в соответствии с тем, как Windows Forms обычно отображает вещи.

Вы можетеуправляйте этим в WPF для каждого элемента, добавив:

TextOptions.TextFormattingMode="Display"

(или "Display" в зависимости от того, какой режим вы хотите).Это присоединяемое свойство было добавлено в WPF v4, чтобы позволить вам выбирать между масштабируемым, но слегка размытым рендерингом текста, который WPF имел с момента его первого выпуска, и искаженным, но четким рендерингом сетки, который Win32 и GDI + (и, следовательно, WindowsФормы) использовать.Это повлияет на элемент, к которому вы примените его, а также на всех его потомков.(Например, если вы установите это значение на StackPanel, оно должно применяться ко всем элементам на этой панели, если только вы не установили для него другое значение локально на дочерних элементах.)

По умолчанию WPF пытаетсяподдерживать лучшую верность исходному дизайну шрифта, чем Win32 или GDI +.Кроме того, он отображает текст таким образом, что это означает, что он масштабируется последовательно - увеличение размера шрифта, скажем, на 12% увеличит ширину текста на 12% на экране.Это не тот случай в Win32 или GDI +, где вы получаете более сложные нелинейные изменения.

Но многие люди жаловались на увеличение размытости, которое вы получаете в обмен на лучшую точность.Вот почему WPF 4 представил это новое свойство.Установите его на Display, чтобы получить менее точный, но более четкий рендеринг в старом стиле.

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

0 голосов
/ 04 июня 2018

Еще один ответ:

Я обнаружил, что также можно изменить тип и размер шрифта в формах Windows:

public partial class MyForm : Form
{
  public MyForm()
  {
    InitializeComponent();
    this.Font = new System.Drawing.Font(
        "Segoe UI",
        9,
        System.Drawing.FontStyle.Regular,
        System.Drawing.GraphicsUnit.Point,
        ((byte)(0)));
  }
}

Эта настройка также будет перенесена на хост-элемент. Таким образом, форма Windows и WPF будут выглядеть одинаково, и никаких изменений в дизайне WPF не требуется.

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