30 декабря 2012 г.

WPF кнопки в Windows 8

Стандартный WPF контрол Button на Windows 8 выглядит ужасно. Куда смотрели дизайнеры и тестировщики? О чем это я... Думаю всем известно, что в Windows Presentation Foundation, в простонародье «Дабью-Пи-Эф», изучением которого я занимаюсь в последнее время с помощью замечательной книги Адама Натана (да уж, немного опоздал), старый ламповый GDI, за некоторыми редкими исключениями, не используется вообще. Стало быть, внешний вид (по умолчанию) всех стандартных элементов управления — это «пародия» на родные для системы кнопки, флажки, списки и меню. По характерным внешним признакам любой .NET программист невооруженным глазом отличит родное для системы приложение от WPF. Для примера, я набросал стандартных элементов на формочки в WinForms (GDI) и WPF, и заскриншотил:

WinForms WPF

Так (справа) выглядит стандартная тема WPF на Windows 7. Неплохо, но могло быть лучше. Что здесь не так? Если вы ср**ый эстет как и я, то заметите неуместный градиент в системном меню, размытые полоски на скролл-баре, намного более светлый цвет прогресс-бара, неправильные тени при нажатии на кнопки и выпадающие списки, нестандартный цвет выделения текста. Но это, в принципе, мелочи. Пережить можно. У WinForms (слева) тоже не все так гладко как хотелось бы, отчасти из-за жуткого шрифта Microsoft Sans Serif, который достался в наследие системе чуть ли не от Windows 3.x. Согласно гайдлайнам Microsoft, в Windows 7 шрифт по-умолчанию должен быть Segoe UI, но в WinForms жуткий MS Sans Serif захардкоджен (эта проблема и пути ее решения подробно расписаны здесь и здесь).
Справедливости ради, у JavaFX, Swing и FireMonkey (клон WPF от разработчиков Delphi) дела с имитацией родных тем Windows обстоят еще хуже, чем у WPF. Но WPF делает сама Microsoft, так что с нее спрос будет повыше.

Чуть выше я упомянул про неправильные тени на кнопках в WPF. Давайте сравним кнопки WinForms и WPF на Windows 7 чуть поближе:

WinForms WPF

Для сравнения я взял кнопки в фокусе (с синей рамкой) и стандартного размера: в WinForms это 23х75, а в WPF — 21х73 пикселя (в WPF у кнопок нет прозрачной однопиксельной окантовки). Сверху вниз: кнопка в обычном состоянии, с наведенным на нее курсором и в нажатом состоянии. Найти 10 отличий будет нетрудно. Самые заметные: в WPF кривовато оцентрирован текст (смещен вниз и вправо), рамка у первой кнопки серая (а должна быть синяя), у второй кнопки не хватает белой рамки внутри (вместо нее голубая), у нажатой кнопки пропал ярко выраженный градиент. Очевидно, что разработчики WPF не стали заморачиваться с попиксельным копированием оригинала, а просто нарисовали похожие кнопки на глаз. Если сравнить кнопки из классической темы (а-ля Windows 95) и темы Luna из Windows XP, то с ними дело (неожиданно) обстоит даже лучше. Там на глаз раличий между системными и WPF кнопками почти нет.

И вот вышла Windows 8, а с ней и .NET 4.5, и, конечно же, новая тема оформления (не считая Modern UI aka Metro). Очищенная от «хрома», максимально упрощенная, легкая и свежая. По началу я даже не сомневался, что разработчикам WPF удастся скопировать новую тему Windows (они назвали ее Aero2). И вот, что они нарисовали:

WinForms WPF

Непонятная рамка выделения в лист-боксе, анимации прогресс-бара нет, текст в текстовом поле уехал в левый верхний угол (народ еще пишет про кривые радио-кнопки на 120dpi, и похоже, что команда WPF не собирается их исправлять), стрелка в комбо-боксе слишком маленькая, а эти кнопки...

WinForms WPF

У кнопок Windows 8 есть едва заметный градиент (0xf0f0f0..0xe5e5e5), при наведении курсора на кнопку появляется приятный белый оверлей, а при нажатии кнопка слегка затемняется. А разработчики WPF видимо решили поглумиться над дизайнерами Windows и вместо кнопки нарисовали серый прямоугольник с синей рамкой. Два последних состояния не различимы на глаз (особенно на TN матрицах ноутбуков), из-за чего создается ощущение, что кнопка не нажимается. Выглядит это по крайней мере странно, учитывая, что комбо-бокс у них почти получился.

Кстати, стандартный WPF Ribbon на Windows 8 лучше не использовать вообще.
Выхода из этой проблемы я вижу два (кроме очевидного «не использовать WPF»): переопределить тему Windows 8 (Aero2.NormalColor.xaml) и нарисовать свои кнопки, или ждать и надеятся, что разработчики WPF перерисуют кнопки в будущих апдейтах .NET Framework.

Нашествие серых прямоугольников в Visual Studio 2012

Хорошо бы еще зарепортить баг на Microsoft Connect, планирую сделать это чуть попозже. Надеюсь, стандартные темы оформления кнопок в WPF волнуют не только меня :)

С наступающим!

UPD: завел баг на Microsoft Connect. Официальный ответ Microsoft:
This is by design. Windows made intentional changes to the themes.
Nuff said...

Комментариев нет:

Отправить комментарий