WPF меняет правила игры для меня. Флагманское приложение моей компании - это программа WinForms, пользовательский интерфейс которой динамически создается из метаданных во время выполнения. В общей сложности потребовалось около шести месяцев, чтобы пользовательский интерфейс был даже стабильным , не говоря уже о привлекательности. Есть еще некоторые ошибки, которые я не смог исправить, в основном потому, что код пользовательского интерфейса безнадежно и неизбежно переплетен с кодом модели данных. И не заводите меня на оконные ручки.
Теперь, когда система работает в течение года или около того, клиенты приходят ко мне с такими вопросами, как «Мы хотели бы иметь возможность изменить порядок информации на этом экране путем перетаскивания» и «Можем ли мы получить эту информацию для отображения в сетке на этой части этой вкладки? " и - мой любимый - "Можем ли мы получить проверку орфографии и автотекст?" Эти запросы попадают в очередь, которая становится чертовски длинной.
Мне потребовалось немало времени, чтобы выяснить, как изменить дизайн приложения, чтобы оно могло поддерживать пользовательский интерфейс WPF. (На самом деле, это значительное занижение. Я боролся с этим время от времени в течение полутора лет, и я начал набирать обороты только после того, как вырвался из книг WPF, над которыми я работал и научился MVVM.) Как только я это сделал, результаты впечатляют.
Код намного проще. Там гораздо меньше логики для отладки. Все в пользовательском интерфейсе на намного быстрее, что важно, потому что в первую очередь это настольное приложение в том, что нам нужен очень отзывчивый пользовательский интерфейс. Моя программа может создавать тысячи элементов управления пользовательским интерфейсом, не беспокоясь о дескрипторах окна. Легкость, с которой я могу изменить внешний вид программы, потрясающая.
(Пример: пользовательский интерфейс представляет DataRow
s с различными шаблонами. Поскольку на данном экране могут быть десятки строк, а курсор довольно мал, полезно, чтобы пользователь мог сказать, На первый взгляд, в какой строке находится курсор. Мне потребовалось десять минут, чтобы реализовать стили, которые теперь делают эту визуальную доступность доступной везде в моем приложении. Это меньше времени, чем потребовалось бы для оценки , что если бы я хотел добавить его в свое приложение WinForms. Конечно, это заняло бы намного больше времени, если бы не было возможности сделать это путем добавления двух стилей. WPF - это не волшебство.)
Есть ли недостатки? Как любит говорить г-жа Пэйлин, ты уверен. Просмотрите некоторые вопросы, которые я задавал для SO - тот, который о , о том, как неопределяемый преобразователь значений изменил поведение привязки данных , является хорошим. Весь подход к отладке привязок «теряй живот, пока патруешь голову» довольно разочаровывает, тем более что ошибки связывания настолько просты, что даже не знают об этом. (Теперь я постоянно держу окно «Вывод» на экране только для того, чтобы при обнаружении каких-либо ошибок привязки во время тестирования движение сообщений, которые регистрируются, попадалось мне на глаза.) Было бы неплохо иметь возможность получить реальная трассировка стека, когда ваше окно выдает XamlParseException
. Не начинай говорить, я могу говорить всю ночь.
И инструменты! Визуальные инструменты Visual Studio для создания пользовательских интерфейсов WPF для меня совершенно бесполезны. У меня есть Blend, и я использовал его для изменения шаблона элемента управления, но в целом я нахожу, что использование Blend похоже на попытку бегать по болоту, полному колпаками и проволокой. Я уверен, что это действительно здорово, если все, что вы знаете, это Blend, но если вы сначала узнали объектную модель WPF и XAML, поведение Blend довольно загадочно. Редакторы XML в Visual Studio и Kaxaml вызывают у меня грусть, а функциональность Resharper WPF, скажем так, находится в стадии разработки. Я очень, очень предпочитаю инструменты для WinForms, которые позволяют мне плавно и быстро создавать код медленного, изворотливого и не поддерживаемого воронами кода, который я собираюсь ненавидеть.