WPF

WPF - это Windows Presentation Foundation (Основа Представления Winows), принципиально новая библиотека классов для создания пользовательского графического интерфейса (GUI).

Нет, WPF не является новым названием для Windows Forms, WPF - это новая и отдельная технология. В .NET 3.0+, прекрасно сосуществуют WPF и Windows Forms. При этом, существуют хорошие механизмы взаимодействия WPF и Windows Forms (т.е. можно поставить WPF элемент в окно Windows Forms и наоборот).

Главное отличие между WPF и Windows Forms состоит в технологии вывода графики: Windows Forms использует устаревший GDI, а WPF - DirectX. Отсюда следует первый ряд преимуществ WPF перед Windows Forms: WPF использует графическую карту, что позволяет ему отображать потрясающие эффекты и сложную анимацию с достаточно хорошей производительностью. Т.е. WPF позволяет создавать очень богатый интерфейс и имеет существенно меньше ограничений для дизайнера, который отныне может легко настроить в интефейсе всё что угодно - от кнопочек до таблиц. Второй ряд преимуществ WPF перед Windows Forms определяется новой структурой классов, динамическими свойствами и событиями и использовании XAML в качестве языка разметки. WPF позволяет гораздо меньше думать об абсолютном позиционировании элементов на окне, содержит хороший набор панелей, которые покрывают практически все необходимые варианты. Например, панель Grid позволяет разместить элементы в виде таблицы, StackPanel - друг за другом, DockPanel - с привязкой элементов по краям. Панель Canvas является аналогом ситуации в Windows Forms - абсолютное позиционирование элементов, но лично я пока не встречал необходимости в её использовании.

Да, есть. Однако, в отличие от Windows Forms, где, например, свойство Anchor было свойством элемента управления, в WPF действует механизм динамических свойств. Например, если элемент управления находится внутри панели DockPanel, ему можно будет установить нужное значение для свойства DockPanel.Dock в XAML, для того чтобы панель сама разместила его, где нужно. Но если элемент управления находится внутри панели Grid, то свойства DockPanel.Dock у него уже не будет, зато будут свойства Grid.Column и Grid.Row, позволяющие определить расположение элемента в таблице.

Дизайнер есть и им вполне можно пользоваться, однако есть мнение, что на данный момент вручную писать XAML удобнее. Ситуацию вполне можно сравнить с ASP.NET, где, насколько мне известно, очень малое количество разработчиков пользуется дизайнером, т.к. "очень хороший уровень" IntelliSense приводит к тому, что скорость работы при редактировании ASPX/ASCX/etc. вручную существенно выше. Можно удивиться количеству XAML, необходимого для написания, однако это не так уж страшно, почти все имена объектов и их свойств подставляются студией. Windows Forms в то же время имеет очень хороший и продуманный дизайнер форм, что является одним из главных доводов против использования WPF в проектах. Кроме всего прочего, для дизайнеров есть Expression Blend, который является решением давней проблемы в разработке ПО: приведения мысли дизайнера к формату разработчика. Так как Expression Blend генерирует XAML и может взаимодействовать с Visual Studio, у разработчиков теперь будет существенно меньше проблем с отрисовкой в окнах задумок дизайнеров.

Наиболее значимых два: DateTimePicker и DataGridView. Однако Скотт Гутри писал, что DataGrid появится в Silverlight 2.0, поэтому есть основания полагать, что появления этих элементов управления в WPF стоит ожидать в будущем. Полный список сравнения элементов управления Windows Forms с WPF аналогами можно посмотреть в MSDN. WPF имеет существенно лучшее устройство вывода элементов управления, поэтому некоторые Windows Forms элементы уже просто не нужны.

В первую очередь, 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 нет специфических анимаций. Т.е., допустим, если нам нужно плавно изменить прозрачность окна наполовину, то логично было бы предположить, что должно быть что-то вроде OpacityAnimation. Однако, такого нет и мы наблюдаем существенно лучший подход, который позволяет анимировать любое свойство любого примитивного типа любого объекта. Для той же прозрачности использовалась бы конструкция DoubleAnimation, в которой свойство Storyboard.TargetProperty имело бы значение "Opacity", Storyboard.TargetName – имя объекта, которому нужно изменить прозрачность и свойство To – новое значение Opacity в промежутке от 0 до 1. Практически все виды анимации можно описать декларативно в XAML. Если учесть набор трансформаций отображения элементов, включающий в себя поворот, масштабирование, искажение прямых углов и т.д., то простор для фантазии в анимациях, практически бесконечный. Главное – это не прибегать к написанию массы анимационной каши в XAML :). Анимации выглядят отлично, однако если увлечься ими, то XAML потом будет просто затруднительно читать.

Просто отлично: поддерживается как односторонняя, так и двухсторонняя связка с данными. В примере выше используется односторонняя связка: в свойство Text для TextBlock устанавливается значение свойства Type у объекта. А вот если это будет TextBox, то будет уже двухсторонняя связка: при изменении текста в элементе управления, будет изменяться и свойство у объекта. Поддерживается огромная масса вариантов.

WPF поддерживается на любых системах, на которые можно установить .NET 3.x, т.е. это Windows XP, Windows 2003 Server, Windows Vista (.NET 3.0 входит) и грядущий Windows Server 2008 (куда, видимо, будет входить уже .NET 3.5). WPF использует аппаратное ускорение графики, поэтому лучше всего ему живётся на компьютерах с современными графическими картами. Однако, насколько мне известно, приложения, сделанные на WPF, работают и на бюджетных картах 5-летней давности.

Будучи прототипным проектом, 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.