WPF визуализируется по-разному в Windows XP и Windows 7 - PullRequest
12 голосов
/ 22 октября 2009

Почему WPF по-разному отображается в Windows XP и Windows 7?

Я использую .NET SP1 на обоих компьютерах ..

Мой макет похож на это окно, которое не имеет панели инструментов и настроено на максимизацию, поэтому оно умещается на весь экран.

В соответствии с этим у меня в Viewbox установлено использование Stretch: Uniform, а под ним у меня есть LayoutRoot.

Таким образом, я надеялся получить одинаковый макет на всех компьютерах, но, похоже, он не выглядит точно так же в Windows XP. Некоторые элементы немного меньше, и их внешний вид выглядит не так хорошо.

Я попытался изменить свое разрешение на компьютере с Windows 7 на то же, что и на компьютере с Windows XP, и оно сохраняет макет, как и положено.

И оба компьютера используют 96 DPI.

Windows XP

Windows 7

Ответы [ 4 ]

10 голосов
/ 25 сентября 2010

Мне потребовалось около трех часов, чтобы, наконец, понять это - после большой детективной работы, но теперь она идеально подходит для пикселей!

Похоже, что WPF в Windows XP и WPF в Windows 7 имеют не только разные шрифты по умолчанию лица , а также шрифт по умолчанию размеры .

  • У меня была проблема, когда шрифты отображались в Windows XP иначе, чем в Windows 7. Это было очень важно, так как окончательный вывод был на принтер, и они должны были быть идентичными. Первоначально казалось, что проблема заключалась в разнице в межстрочном интервале.
  • Да - у меня в Windows XP был установлен тот же шрифт, что и в Windows 7
  • Да - я попробовал очень общий шрифт (Arial), но у меня все еще были те же проблемы.
  • Да - одинаковое DPI на обеих машинах.
  • Да - тот же результат, будь то на виртуальной машине (в режиме Windows XP) или на реальной машине с Windows XP.

В конце концов я обнаружил, что шрифты, в которых я указывал явный размер, выглядели одинаково в Windows XP, и только те, в которых я не указал явный размер, были разными.

Итак, вот как я это исправил в MainWindow.xaml - с помощью ContentControl для установки размера по умолчанию:

<Grid x:Name="LayoutRoot" Background="#FFDEDEDE" UseLayoutRounding="True">
    <ContentControl FontFamily="Segoe UI" FontSize="12">
         ... window contents ...
    </ContentControl>
</Grid>

Примечание: Если вы используете Смесь , вам может потребоваться ввести FontSize="12" вручную. Если вы выберете его в конструкторе свойств, он удалит его, потому что он думает, что 12 уже по умолчанию!

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

Где еще можно установить размер шрифта по умолчанию? Во всяком случае, у меня теперь рендеринг с идеальным пикселем в Windows XP и Windows 7, и они отличаются только отличиями сглаживания в чистом виде.

Примечание: UseLayoutRounding не является частью моего решения, но я всегда использую его и для своего корневого элемента управления.

6 голосов
/ 29 апреля 2010

разные шрифты по умолчанию

Сделать кнопку WPF

<Button x:Name="button" Width="100" Height="25" Content="Button" Click="Button_Click"/>

и код позади:

private void Button_Click(object sender, RoutedEventArgs e)
{
    string msg = string.Format("Number of fonts: {1}{0}Font Family: {2}{0}Font Size: {3}",
        Environment.NewLine,
        button.FontFamily.FamilyNames.Values.Count.ToString(),
        button.FontFamily.FamilyNames.Values.First().ToString(),
        button.FontSize.ToString());

    MessageBox.Show(msg);
}

Запустите это в каждой операционной системе, и вы увидите, что шрифты по умолчанию для XP и Windows7 отличаются.

Шрифт по умолчанию для XP имеет размер «Tahoma» 11

Шрифт по умолчанию для Windows 7 имеет размер «Segoe UI», размер 12

2 голосов
/ 22 октября 2009

Разные версии Windows имеют разные шрифты по умолчанию (также разные версии одних и тех же шрифтов) и разные механизмы рендеринга шрифтов - в результате размер текста в разных системах разный.

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

2 голосов
/ 22 октября 2009

Мой опыт:

Я не уверен, что это проблема, я заметил, что Windows 7 использует аппаратное ускорение для рисования приложения WPF. Windows XP этого не делает.

Вы можете проверить, так ли это, используя что-то вроде этого:

public partial class App
{
    public static int Tier { get { return RenderCapability.Tier >> 16; } }

    static App()
    {
        Console.Out.WriteLine("Render Tier: {0}", Tier);
    }
}

Ваш уровень рендеринга должен возвращать 2, если используется полное аппаратное ускорение рисования. 0 = программное обеспечение, 1 = что-то посередине, если угадать

...