WPF
Что такое WPF?
WPF - это Windows Presentation Foundation (Основа Представления Winows), принципиально новая библиотека классов для создания пользовательского графического интерфейса (GUI).
Это новое название Windows Forms? Как связаны WPF и Windows Forms?
Нет, WPF не является новым названием для Windows Forms, WPF - это новая и отдельная технология. В .NET 3.0+, прекрасно сосуществуют WPF и Windows Forms. При этом, существуют хорошие механизмы взаимодействия WPF и Windows Forms (т.е. можно поставить WPF элемент в окно Windows Forms и наоборот).
В чём состоят главные отличия между Windows Forms и WPF?
Главное отличие между WPF и Windows Forms состоит в технологии вывода графики: Windows Forms использует устаревший GDI, а WPF - DirectX. Отсюда следует первый ряд преимуществ WPF перед Windows Forms: WPF использует графическую карту, что позволяет ему отображать потрясающие эффекты и сложную анимацию с достаточно хорошей производительностью. Т.е. WPF позволяет создавать очень богатый интерфейс и имеет существенно меньше ограничений для дизайнера, который отныне может легко настроить в интефейсе всё что угодно - от кнопочек до таблиц. Второй ряд преимуществ WPF перед Windows Forms определяется новой структурой классов, динамическими свойствами и событиями и использовании XAML в качестве языка разметки. WPF позволяет гораздо меньше думать об абсолютном позиционировании элементов на окне, содержит хороший набор панелей, которые покрывают практически все необходимые варианты. Например, панель Grid позволяет разместить элементы в виде таблицы, StackPanel - друг за другом, DockPanel - с привязкой элементов по краям. Панель Canvas является аналогом ситуации в Windows Forms - абсолютное позиционирование элементов, но лично я пока не встречал необходимости в её использовании.
А есть ли реализация anchoring и docking, аналогичная Windows Forms?
Да, есть. Однако, в отличие от Windows Forms, где, например, свойство Anchor было свойством элемента управления, в WPF действует механизм динамических свойств. Например, если элемент управления находится внутри панели DockPanel, ему можно будет установить нужное значение для свойства DockPanel.Dock в XAML, для того чтобы панель сама разместила его, где нужно. Но если элемент управления находится внутри панели Grid, то свойства DockPanel.Dock у него уже не будет, зато будут свойства Grid.Column и Grid.Row, позволяющие определить расположение элемента в таблице.
Насколько хорош визуальный дизайнер окон WPF в Visual Studio?
Дизайнер есть и им вполне можно пользоваться, однако есть мнение, что на данный момент вручную писать XAML удобнее. Ситуацию вполне можно сравнить с ASP.NET, где, насколько мне известно, очень малое количество разработчиков пользуется дизайнером, т.к. "очень хороший уровень" IntelliSense приводит к тому, что скорость работы при редактировании ASPX/ASCX/etc. вручную существенно выше. Можно удивиться количеству XAML, необходимого для написания, однако это не так уж страшно, почти все имена объектов и их свойств подставляются студией. Windows Forms в то же время имеет очень хороший и продуманный дизайнер форм, что является одним из главных доводов против использования WPF в проектах. Кроме всего прочего, для дизайнеров есть Expression Blend, который является решением давней проблемы в разработке ПО: приведения мысли дизайнера к формату разработчика. Так как Expression Blend генерирует XAML и может взаимодействовать с Visual Studio, у разработчиков теперь будет существенно меньше проблем с отрисовкой в окнах задумок дизайнеров.
Для каких элементов управления Windows Forms в WPF нет аналогов?
Наиболее значимых два: DateTimePicker и DataGridView. Однако Скотт Гутри писал, что DataGrid появится в Silverlight 2.0, поэтому есть основания полагать, что появления этих элементов управления в WPF стоит ожидать в будущем. Полный список сравнения элементов управления Windows Forms с WPF аналогами можно посмотреть в MSDN. WPF имеет существенно лучшее устройство вывода элементов управления, поэтому некоторые Windows Forms элементы уже просто не нужны.
Что позволяет делать XAML?
В первую очередь, XAML позволяет декларативно описывать вид окна, расположение и вид элементов на нём. Кроме этого, он позволяет описывать анимации элементов и связывать их с данными. Фактически, XAML не привязан к WPF и является только декларативным языком описания объктов (в Windows Workflow Foundation тоже используется XAML). Набор тегов XAML (который является подвидом XML) не является ограниченным, и в XAML документ можно включать не только видимые объекты (от эллипсов-прямоугольников до кнопок-списков), но и не видимые, например, если есть класс Fruit, я могу включить в XAML коллекцию объектов типа Fruit и связать, например ComboBox (или ListView) с этим списком, после чего свойство ComboBox.SelectedItem (ListView.SelectedItems) будет иметь значение фрукта, который выбрал пользователь. Для следующего примера кода на C# писать почти не надо - только маленький класс FruitsBinding.Fruit, состоящий из двух свойств - string Type и decimal PricePerKg.
Какие анимации поддерживаются WPF?
В WPF нет специфических анимаций. Т.е., допустим, если нам нужно плавно изменить прозрачность окна наполовину, то логично было бы предположить, что должно быть что-то вроде OpacityAnimation. Однако, такого нет и мы наблюдаем существенно лучший подход, который позволяет анимировать любое свойство любого примитивного типа любого объекта. Для той же прозрачности использовалась бы конструкция DoubleAnimation, в которой свойство Storyboard.TargetProperty имело бы значение "Opacity", Storyboard.TargetName – имя объекта, которому нужно изменить прозрачность и свойство To – новое значение Opacity в промежутке от 0 до 1. Практически все виды анимации можно описать декларативно в XAML. Если учесть набор трансформаций отображения элементов, включающий в себя поворот, масштабирование, искажение прямых углов и т.д., то простор для фантазии в анимациях, практически бесконечный. Главное – это не прибегать к написанию массы анимационной каши в XAML :). Анимации выглядят отлично, однако если увлечься ими, то XAML потом будет просто затруднительно читать.
Как в WPF со связыванием с данными (data-binding)?
Просто отлично: поддерживается как односторонняя, так и двухсторонняя связка с данными. В примере выше используется односторонняя связка: в свойство Text для TextBlock устанавливается значение свойства Type у объекта. А вот если это будет TextBox, то будет уже двухсторонняя связка: при изменении текста в элементе управления, будет изменяться и свойство у объекта. Поддерживается огромная масса вариантов.
Где поддерживается WPF, какой компьютер требует?
WPF поддерживается на любых системах, на которые можно установить .NET 3.x, т.е. это Windows XP, Windows 2003 Server, Windows Vista (.NET 3.0 входит) и грядущий Windows Server 2008 (куда, видимо, будет входить уже .NET 3.5). WPF использует аппаратное ускорение графики, поэтому лучше всего ему живётся на компьютерах с современными графическими картами. Однако, насколько мне известно, приложения, сделанные на WPF, работают и на бюджетных картах 5-летней давности.
Как WPF связан с Silverlight?
Будучи прототипным проектом, Silverlight имел кодовое название WPF/E, что означает WPF Everywhere (Везде). Сейчас основная часть Silverlight 1.0 заключается в том, что он умеет показывать XAML (из объектов, пришедших из WPF, однако далеко не всех из них) и позволяет проводить действия с объектами на JScript. Silverlight 2.0 позволит использовать модель программирования, уже гораздо более близкую к WPF приложениям, т.к. будет содержать реализацию CLR и поддерживать больше WPF объектов. В Silverlight нет практически ничего нового, это кросс-платформенная реализация части WPF и .NET для использования в Сети, в браузере.
Некоторые приложения, которые уже сейчас разработаны на WPF, можно посмотреть в у Microsoft, и у Тима Снита (Team Sneath) в блоге про WPF.