Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Обзор framework 3.x: WPF


Автор: Walker 6.3.2008, 11:48
Поскольку, на данный момент, на Винграде отсутствует раздел, посвящённый платформе .net 3.0/3.5, я помещаю эту статью в WinForms, как наиболее близкую к разработке графического интерфейса. Когда соответствующий раздел будет открыт, а произойдёт это уже, вероятно, в скором времени, я попрошу модераторов перенести эту статью туда.

    Сейчас, наверное, уже не найти прикладного программиста, незнакомого, хотя бы отдалённо, с концепцией .net. Кинутый Microsoft’ом в 2000-м году снежный ком, двигаясь в сторону композиционного программирования, разросся до весьма крупных размеров. Правда, за счёт существенного подталкивания со стороны самого MS.smile Тем не менее, за свою практически десятилетнюю историю Фреймворк совершил уже третий прыжок, предложив разработчикам ПО три новых технологии.
Windows Presentation Foundation;
Windows Workflow Foundation;
Windows Communication Foundation.

    Изменения коснулись не только платформы. Так в C# и некоторых других языках .net появилась поддержка синтаксиса SQL-like запросов к коллекциям объектов (поддержка LINQ), анонимные свойства, лямбда-выражения и маршрутизируемые события. Соответственно, для реализации всех вышеперечисленных новшеств были внесены изменения и в компиляторы и в саму студию. Сегодня мы поговорим о WPF, а в следующей статье рассмотрим остальные новшества.. Итак,
    Windows Presentation Foundation. Новая концепия построения графического интерфейса, призванная заменить Windows Forms. Последняя представляла собой расширенный .net API к контролам, использовавшимся на протяжении всей истории существования Windows. Отрисовка и функционал интерфейса базировались на user32.dll, тормозной GDI и приторможенной GDI+.smile Отрисовка WPF выполяется средствами DirectX. А это означает, что продвинутую анимацию, 3D, всякие вершинные шейдеры, наложение текстур и рендеринг теперь можно использовать не только в games developing, но и в разработке дружественного пользовательского интерфейса.
Библиотеки  WPF высокоуровневые, и, как водится, кучу верификационного кода уже написали разработчики MS. Так, например, окошки с населяющими его элементами независимы от разрешения экрана. Теперь размеры проставляются в относительных единицах (device-independet units). Это является гарантией того, что при воспроизведении изображения на любом устройстве визуализации от ЖК монитора до проектора изображение будет пропорциональным и занимать такую область экрана, которая планировалась изначально. Новичок, не имеющий представления о продвинутой графике, способен ваять приложения, по меньшей мере, не уступающие WinForms. Более того, в WPF перенесено большинство знакомых контролов, включающих прежний функционал и вдобавок реализующие новые интерфейсы.
    Для облегчения синтаксиса инициализации полей экземляров классов на базе XML был разработан язык разметки XAML. Таким образом, реализуется модель декларативного программирования – работа с объектом разделена на два файла. В одном на языке разметки описана его “внешность” – установлены значения свойств, объявлена подписка на события, а во втором осуществляется эксплуатация функционала объекта на языке приложения. Файл XAML компилятором XAML транслируется в бинарный BAML, который встраивается в виде ресурса в dll или exe. Таким образом, редактируя XAML-файл, собирая и подключая, мы можем влиять на “внешность” объекта, не затрагивая внутренней логики его использования в приложении.
    Применительно к разработке графического интерфейса, его использование, вдобавок, означает облегчение разработки скинов, изменение композиции элементов, и, самое главное – возможно вообще перепоручить внешность приложения профессиональным дизайнерам. XAML вполне логичен и хорошо структурирован для того, чтобы можно было написать его генератор. Генератор подшивается к дизайнерской программе и тогда возможен ревёрсинг – дизайнер рисует внешность приложения сразу в том виде, в каком хочет его видеть, с учётом всех правил дизайна и психологии пользовательского интерфейса, накладывает цветовые маски, блики, зеркальные отражения, поворачивает элементы; он не заботится о языке – файл XAML разметки генерируется программой, а затем программистом включается в приложение.
    Когда работаете в дизайнере WPF Visual Studio, начните относиться к XAML, с точки зрения эксплуатации PropertyGrid. Так его, на мой взгляд, проще понять через призму разработчика. Обратите внимание, что по сути
Код

<Button Height="96" Width="100">
            <Button.Background>
                <LinearGradientBrush SpreadMethod="Repeat">
                    <GradientStop Color="GreenYellow" Offset="0" />
                    <GradientStop Color="Green"  Offset="1" />            
                </LinearGradientBrush>
            </Button.Background>
            Hello!
</Button>

и
Код

Button b = new Button();
b.Height = 96;
b.Width = 100;
b.Content = "Hello!";
LinearGradientBrush lgb = new LinearGradientBrush();
lgb.GradientStops.Add(new GradientStop(Colors.GreenYellow, 0));
lgb.GradientStops.Add(new GradientStop(Colors.Green, 1));
b.Background = lgb;

значат одно и тоже.
    В тэги мы заключаем класс, объект которого хотим создать, задаём значения простых свойств элементарного типа через указание значений атрибутам – вызов конструктора и инициализация в одном флаконе. Если для установки значения какого-либо свойства необходимо использовать неэлементарный объект, который предстоит создать в куче с использованием ключевого слова new – строим для атрибута отдельный узел. Так для установки цвета фона, нам нужно создать объект типа Brush или производный от него. Вот так описание легко расширяется. Естественно, средой осуществляется проверка и приведение типов. Значение должно быть того же типа, что и свойство, описываемое в атрибуте.
    Между открывающим и закрывающим тэгами вносим содержимое контрола - значение свойства Content. (Для нашей кнопки – это надпись “Hello!”) . Обратите внимание – Content имеет тип object. Содержимым кнопки может являться объект другого класса – другой контрол. Т.е. контролы могут легко встраиваться друг в друга, образуя каскады. TreeView создаёт набор из узлов не типа TreeNode, а из узлов ItemsCollection, куда может входить опять же что угодно и т.д.
Для того, чтобы обращаться к контролу из программного кода, необходимо установить значение атрибута Name, определённого в пространстве имён http://schemas.microsoft.com/winfx/2006/xaml. Установка значения этого атрибута равносильна объявлению переменной типа, который мы описываем.
Код

<TreeView Name=myTreeView />

Код

myTreeView.Items.Add(new Button());
myTreeView.Items.Add(new TextBox());
myTreeView.Items.Add(“My name is Walker”);

    Обратите внимание – код может ничего не знать ни о расположении объекта, ни об использующейся цветовой гамме, ни, даже о качественном составе. Приложение знает только о том, что у него есть кнопка, дерево, текстовое поле, поле для рисования, выстроенные хоть в ряд, хоть друг в друге, хоть перевёрнутые с ног на голову – без разницы. Поэтому, если у вас был написан плейер
Код

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <MediaElement …/>
  <Button Grid.Row="1" …/>
</Grid>

Вдруг прибежал неожиданно начальник и сказал, что видео должно играть в самой кнопке, а кнопку можно было таскать по всему плейеру и менять её как угодно в размерах, Вы говорите: “Нет проблем!” и пишите новую инструкцию разметки:
Код

<InkCanvas EditingMode="Select">        
<Button Height="100" Width="100" InkCanvas.Top="20" InkCanvas.Left="20">
             <MediaElement …/>
         </Button>
</InkCanvas>

    Всё! Видео встроено в кнопку, но при этом кнопка осталась кнопкой, а видео – видео(‘мsmile)
    О WPF можно сказать ещё много хорошего – во-первых, введена поддержка стилей. Таким образом, закладывается основа хорошего тона – опишите заранее шаблоны и потом только привязывайте их к элементам. Во-вторых, поддержка концепции команд. Означает это то, что Вы можете определить команду – например, запись в файл или печать на принтер, реализовать её код один раз, а затем только привязывать её к активным элементам пользовательского интерфейса. А ещё WPF реализует концепцию маршрутизируемых событий и много других интересностей.
    Тем не менее, описание было бы совсем не полным, если не упомянуть о Silverlight, плагин для которого под наш любимый браузер настойчиво рекомендует скачать Майкрософ при посещении их сайта. МС позиционирует SilverLight, как аналог флэш следующего поколения. По сути – это аналогия нового, динамичного интерфейса, но под web. Кто был прошлой осенью на “днях разработчика” – должны помнить ролик, демонстрирующий puzzle-film. ВидеоРолик разбивается на части. В каждом фрагменте продолжает играть кусок клипа. Пользователь мышкой должен из всех этих кусков собрать клип обратно. 
    Вот такой краткий обзор возможностей новой технологии. А мы совсем не коснулись анимации, воспроизведения звука и видео, а также построения объёмного пользовательского интерфейса. Но если эта статья найдёт положительный отклик, и Вам интересно будет продолжение, я буду по мере изучения выкладывать уроки по WPF, описывающих применение наиболее интересных фич. Поскольку сам ещё нахожусь в стадии освоения той технологии, то буду очень рад совместному изучению каких-то вопросов. Если у Вас имеются знания, противоречащие моим – поправляйте. Так, например, первым уроком мы с Вами можем попробовать разобраться в синтаксисе XAML.
    Для наших задач вполне хватит дизайнера студии. Чем он мне не нравится – не хватает описания элементов списка, открывающихся IntelliSense. Приходится дополнительно проверять тип и читать описание либо в MSDN, либо создавая код в cs-файле. Кому же нужен изысканный интерфейс, при написании которого генерируется миллион строк XAML-кода – смотрите в сторону Expression Blend и других визуальных редакторов. На момент написания этой статьи я не знаю ни одного свободного инструмента, хотя сам бы с большим удовольствием принял участие в реализации XAML-дизайнера. Может открыть проект на Винграде?
    Что почитать:
    WPF:
url=http://www.amazon.com/Pro-WPF-Windows-Presentation-Foundation/dp/1590597826]Matthew MacDonald. Pro WPF.[/url]
Видел, что эта книга вышла уже http://www.williamspublishing.com/Books/978-5-8459-1344-9.html.
VS2008 и .net:
http://www.amazon.com/Pro-2008-NET-Platform-Fourth/dp/1590598849
Кстати, никто не знает – займётся ли Винград переводом этой книги, и кто войдёт в творческую группу?
    Остаётся добавить, что .net framework 3.0 включён в Windows Vista, 3.5 – в Visual Studio 2008, которую опять же можно найти в свободной редакции VS2008 Express Edition. Прошу заметить, что в VS2008C++ EE теперь включён WinAPI SDK, и его теперь не требуется больше подключать дополнительно. 
    P.S. Совет дня.smile VS2008 позволяет разрабатывать приложения на платформах 2.0-3.5. При этом, переключиться можно прямо в процессе разработки. Для этого, в свойствах проекта на вкладке Application выберите Target Framework. Студия проверит закономерность зависимостей и выдаст соответствующие предупреждения, если вы понижаете версию платформы.

Удачи в освоении! До новых встреч!


Автор: HellMasterHaiL 6.3.2008, 12:05
да, впф - очень интересная технология, с нетерпением буду ждать новых статей, пеши исчо \=-)))

Автор: Walker 6.3.2008, 12:51
Спасибо! smile 
С удовольствием буду выкладывать обучалки и находки.

Автор: flex21 6.3.2008, 22:01
Статься понравилась. Замечательно, буду ждать ещё smile 

Автор: andrew_sh 9.3.2008, 01:02
Присоединяюсь к вышесказанному.  smile 
С нетерпением буду ждать продолжения !!!

Автор: Горынч 17.3.2008, 14:27
Согласен тема клевая.  Заказал книгу WPF: Windows Presentation Foundation в .NET 3.0 для профессионалов
Мэтью Мак-Дональд. Жду. 
Хочу вот ссылку дать. http://www.thevista.ru/list.php?c=articles1101
Неплохая подборка статей по WPF на русском . ;)  Может автор их полистает и напишет что то новое или материал интересней подаст.
 

Автор: Real 18.3.2008, 22:59
Очень интересно!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)