Текст отображается по-разному в окне WPF и внутри ElementHost

Я использую совместимость 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 http://i51.tinypic.com/14j4xnc.jpg

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

есть ли идеи как это исправить?

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

2 ответов


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

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

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

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

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

вы можете управлять этим в WPF на основе каждого элемента, добавив следующее:

TextOptions.TextFormattingMode="Display"

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

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

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

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


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

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

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)));
  }
}

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