Подпишись на наш Twitter

Быть в курсе появления новых статей!

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

Например, можно себе представить, что если пользователь в оригинале установил разрешение своего монитора 1280 x 960 и позднее изменил на 640 x 480, то WPF окно которое изначально имеет размер 4"x4" на большом разрешении должно все еще отображаться в том же размере после того как у монитора поменяли разрешение. К сожалению, простой эксперимент показывает, что понимание термина "независимость от разрешения" не правильно.

Другая потенциальное понимание этого термина, что WPF окно будет показано в томже размере независимо от настроек DPI. Нажмите правой кнопкой мыши на Desktop, Properties, Settings, Advanced. На это странице настроек вы увидите выпадающий список, в котором обычно выбрано "Normal size(96 DPI)"

Другие варианты (как минимум под Windows XP) это "Large size (120 DPI)" и "Custom setting…". Можно логично предположить что независимость от разрешения, по-видимому не ссылается на текущее разрешение которое установлено на мониторе (1200 x 960 против 640 x 480), что возможно имеется ввиду, что WPF окно будет показано с теми же размерами независимо от значения установленного свойства DPI. Но к сожалению другой простой эксперимент доказывает, что это понимание "независимость от разрешения" тоже неправильно.

Как оказалось Microsoft не совсем честно относительно независимости от разрешения для WPF. Просто объяснение того, что имеется ввиду под этим термином немного сложнее. Следующие эксперименты действительно показывают, что WPF действительно не зависит от разрешения.

Мы сделаем нашу проверку, запустив тестовое WPF приложение на двух системах с LCD экранами, которые имеют разные физические размеры пикселей. Тестовое приложение рисует 4-х дюймовую линию, длину которой мы проверим, приложив настоящую линейку к экрану. Имеются следующие тестовые системы:

Система 1: рабочая станция с LCD монитором: Экран ширина x высота в пикселях: 1600 x 1200 Экран ширина x высота в дюймах: 17.0 x 12.75. Поэтому он имеет 1600 / 17.0 = 94 физических пикселей на дюйм (физических DPI) по горизонтали и 1200 / 12.75 = 94 физических DPI по вертикали.

Система 2: ноутбук с LCD экраном: Экран ширина x высота в пикселях: 1400 x 1050 Экран ширина x высота в дюймах: 12.0 x 9.0. Поэтому он имеет 1400 / 12.0 = 117 физических DPI по горизонтали и 1050 / 9.0 = 117 физических DPI по вертикали.

Ключевым моментом здесь является то, что пиксели монитора рабочей станции на 25% больше чем у ноутбука. (117 / 94 = 1.25)

Перед тестами нам нужно пересмотреть некоторую терминологию. В классическом Win32 приложении используются координаты в единицах "физические пиксели", WPF приложение использует координаты которые выражаются в "в машинно независимых единицах" (далее DIU). Один WPF DIU определен как 1/96 дюйма. Это определение единиц позволяет WPF координатам иметь значение в дюймах, что правильнее, чем в физических пикселях. Так что третье возможное понимание термина "независимость от разрешения" может быть, что одно и тоже WPF приложение будет отображено в одном размере на двух разных мониторах установленных в одинаковое разрешение (1024 x 768 для примера), в отличие от физических пикселей. Под этой теорией диалоговое окно в 4 дюйма шириной на Системе 1 с 94 физическими DPI LCD и должно по прежнему 4 дюйма шириной на Системе 2 с 117-ю физическими DPI LCD.

К несчастью начальные результаты моего эксперимента кажется расходятся с теорией. Следующая фотография показывает, что линия в 384 DIU шириной реально отображается шириной 4.08" на моем десктопном мониторе и 3.28" шириной на мониторе ноутбука. Ни один монитор не достиг желаемых результатов отображения линии длинной 384 DIU в 384/96 = 4.00".

Правильное объяснение заключается в более тщательном анализе взаимосвязи между двумя важными настройками экрана. Первая это настройка разрешения экрана (1024 x 768) и вторая "Advanced/DPI setting" (смотри картинку ниже). Обе они действуют как "масштабирующие факторы" которые позволяют каждому пользователю принудительно на его мониторе выглядеть больше (для лучшего чтения) или меньше (для большего удобства на десктопах).

Мы можем устранить первый масштабирующий параметр из наших тестов требованием что "разрешение экрана" должно быть установлено в "родное разрешение" для систем с LCD экранами. Т.к. Система 1 имеет физическое разрешение 1600x1200 пикселей, то мы должны установить его разрешение в 1600x1200 пикселей. В Системе 2 аналогично 1400x1050.

Второй масштабирующий фактор "настройки DPI", которые различаются в наших тестах. WPF самостоятельно не знает, какое текущее физическое значение DPI у монитора установлено. Вместо этого WPF использует этот второй масштабирующий фактор "настройки DPI", который не совпадает с настоящим физическим DPI, поэтому "независимость от разрешения" для WPF нарушается, хотя по правде это не так.

Теперь давайте проверим наши полные тестовые результаты. Мы начнем с 94 физических DPI на десктопном LCD.

Для первого теста используем настройки Windows по умолчанию для "настроек DPI" равные "Normal size (96 DPI)", которые использует большинство людей. Фотография показывает линию которую мы ожидаем длинной в 4" реально в 4.08", что на 2% больше. Почему? потому что LCD имеет физических DPI только 94, но значение "настройки DPI" говорят WPF действовать, как будто мы имеем 96 физических DPI на экране (что тоже на 2% больше от реальных 94 DPI).

Теперь давайте попробуем установить "настройки DPI", чтобы все стало больше и проще для чтения. Для этого мы изменим их на "Large size (120 DPI)". Теперь линия, которую мы ожидаем видеть 4" длинной, будет реально 5.10". Опять же объяснение в том, что "обманули" WPF о настройках DPI нашего монитора. WPF считает, что запущен с 120 DPI экране, тогда как реально физических DPI только 94. Искажение получается: 120/94=1.28 и 5.10/4.00=1.28. Оба на 28% различаются.

В конце мы попробуем применить правило, которое советовалось ранее. Мы сделаем свои "настройки DPI" в значение 94, что совпадает с физическими 94 DPI для LCD. И наконец, удача! Теперь на фотографии напротив экрана показывает отображение 4" линии как и ожидалось длинной 4".

Теперь есть успешное объяснение различий тестов для 94 физических DPI десктопного LCD, теперь давайте переключимся на ноутбучный LCD с 117 физическими DPI, чтобы увидеть тот же самый эксперимент с этим монитором, который даст нам тот же результат.

В первом тесте мы опять используем настройки по умолчанию "Normal size (96 DPI)". Теперь на фотографии 4" линия отображается только на 3.28", что на 18% меньше. Почему?. потому что наш LCD имеет 117 физических DPI, но в настройках стоит 96 DPI. Разница получается: 3.28/4.00=0.82 и 96/117=0.82. Оба результата дают 100-82=18% разницы.

Для последнего теста используем правило, как советовалось ранее. Установим настройки в 117 DPI, что соответствует 117 DPI ноутбучного LCD. И правило снова сработало! Теперь на фотографии 4" линий отображается ровно на 4".

В заключении мы увидели, что WPF действительно независима от разрешения настолько насколько настройки экрана Windows установлены правильно. Под независимостью от разрешения WPF реально имеется ввиду, что два монитора установлены в свое родное разрешение, что точно показывает их DPI для WPF и позволяет показывать WPf окно одного размера. Исходя из этих условий монитор с 96 физическими пикселями на дюйм покажет любое WPF окно в том же размере, что и имеющий 192 физических пикселя на дюйм. Отличие только в том, что последний монитор будет показывать намного четче, чем первый

Оригинал: Is WPF Really Resolution Independent?




Дата публикации: 16.06.2007 20:20

Ярлыки: DPI, Graphics, WPF