Методика создания интерактивных приложений Silverlight

Создание бизнес-приложений Silverlight с использованием .NET RIA сервисов

Разбить на страницы
Показывать лекцию целиком

Rich Internet Application (RIA) - это особый класс веб-приложений. RIA приложения позволяют делать богатый пользовательский интерфейс, но без необходимости перегрузок страниц, как в обычных веб-приложениях. Типовая архитектура таких приложений приведена на рис. 4.1

(рис 4.1) Архитектура RIA приложений

Обычно приложение состоит из серверной части, где размещены веб-сервисы, бизнес-логика, СУБД. Клиентская часть может быть HTML+Ajax или Silverlight. Мы будем рассматривать в контексте Silverlight. По сети части взаимодействуют по протоколам SOAP или REST (см. Работа Silverlight с web сервисами).

В обычном бизнес приложении уровни клиента и сервера разъединены и независимо разрабатываются. Но в RIA приложениях две части разрабатываются как одно приложение. Такую возможность дают .NET RIA сервисы. RIA сервисы не входят в состав Silverlight 3 и доступны для скачивания по адресу: http://www.microsoft.com/downloads/details.aspx?FamilyID=76bb3a07-3846-4564-b0c3-27972bcaabcedisplaylang=en

.NET RIA сервисы упрощают разработку многоуровневых приложений объединяя платформы ASP.NET и Silverlight. Логика приложения располагается на среднем уровне и отвечает за запросы, изменения данных и прочие методы. .NET RIA сервисы автоматически генерируют прокси-классы для клиента, чтобы тот мог использовать их в этих операциях. И так как на уровнях логики и клиента сервисы работают с одной средой выполнения CLR (Common Language Runtime), разработчик может писать код, работающий на обоих уровнях. Использование .NET RIA сервисов стирает грань между разработкой клиентской и серверной частями и позволяет разрабатывать обе части, как одно приложение.

В общем .NET RIA сервисы могут использоваться не только с Silverlight, но и с другими технологиями написания клиентской части (Рис. 4.2). В любом случае бизнес-логика приложения будет передаваться через прокси-классы клиенту.

(рис 4.2) Возможности . NET RIA сервисов

Создание приложений с .NET RIA сервисами

На Рис. 4.3 показан процесс создания приложения Silverlight с поддержкой .NET RIA сервисов в Visual Studio 2008.

затем

(рис 4.3) Создание проекта Silverlight и .NET RIA Services

Есть возможность изменить существующий проект Silverlight, для того чтобы тот мог работать с .NET RIA сервисами. Автоматически в references проекта добавится ссылка на библиотеку System.Windows.Ria.

(рис 4.4) Изменение свойств проекта Silverlight для работы с .NET RIA сервисами

http://www.silverlightshow.net/AWWeb/AdventureWorksLOB.aspx - пример бизнес-приложения, использующего .NET RIA сервисы

(рис 4.5) Пример бизнес-приложения Silverlight, использующего .NET RIA сервисы

В примере виден список товаров, возможна сортировка (List price), группировка (Category), поиск, постраничный вывод.

Преимущества для клиента при использовании .NET RIA сервисов.

Ключевыми моментами создания многоуровневых приложений с использованием .NET RIA сервисов являются:

  • Стандартное приложение Silverlight может быть трансформировано в многоуровневое с помощью линка RIA link между проектом Silverlight и веб-проектом.
  • Простейшее многоуровневое приложение состоит из 2-х отдельных проектов внутри одного решения (solution), один из них проект ASP.NET (уровень бизнес-логики), а другой - приложение Silverlight (клиент).
  • Класс DomainService в серверном проекте располагает набором сущностей и операций, свойственных определенному домену. Разработчик помещает логику приложения в этот класс.
  • Когда решение скомпилировано, прокси-класс для клиента генерируется автоматически для проекта Silverlight, согласно сущностям и операциям, определенных классом DomainService.
  • Клиент Silverlight взаимодействует со сгенерированным кодом прокси-класса DomainContext для получения и манипулирования соответствующими сущностями.
  • И сервер и клиент работают с одним и тем же набором сущностей, делая возможным прозрачно использовать бизнес-логику и правила ввода данных на всех уровнях.
  • Преимуществами для клиента при использовании .NET RIA сервисов являются:

  • Навигация по страницам с помощью кнопок браузера "вперед" и "назад". Заголовок страницы изменяется во время навигации.
  • Проверка правильности ввода (валидация) данных на клиенте.
  • Фильтрация, сортировка, разбиение на страницы - осуществляется декларативно
  • Создание окон в рамках Silverlight 3 приложения - необходимая функция для бизнес-приложений
  • Обеспечение безопасности через [RequiresAuthentication] - атрибут метода или свойства
  • Любые источники данных ADO.NET, SOAP|REST, LINQ, SQL Server
  • Полное тестирование кода (unit test)
  • Добавление любых бизнес-операций
  • Шаблон "Silverlight Business Application"

    Шаблон Silverlight Business Application Template дает возможность начать разработку бизнес приложения Silverlight с .NET RIA сервисами, которое поддерживает аутентификацию и регистрацию пользователей.

    (рис 4.6) Шаблон Silverlight Business Application(рис 4.7) Проект, созданный по шаблону Silverlight Business Application

    По шаблону создаются приложение и приложение ASP.NET, которое хостит приложение Siverlight. Автоматически создается ссылка на .NET RIA сервисы. Создается решение с двумя проектами:

  • MyBusinessApplication - проект, содержащий код Siverlight. Это клиентская часть.
  • MyBusinessApplication.Web - проект, содержащий код веб-приложения ASP.NET. Это средний уровень, уровень сервера.
  • Ниже приведена работа приложения, а именно шаблонные аутентификация и регистрация.

    (рис 4.8) Аутентификация пользователя в шаблоне Silverlight Business Application(рис 4.9) Регистрация нового пользователя в шаблоне Silverlight Business Application

    Сущности

    При создании бизнес-приложения всегда имеется подключение к базе данных. Оно происходит на уровне сервера приложений. Для этого необходимо создать класс, например, AdventureWorks_DataEntities. Клиентская часть к базе данных напрямую не обращается, только через этот класс, который оперирует понятиями сущностей ( Entity ).

    Например, мы получаем доступ к базе данных AdventureWorks с помощью Entity Framework и делаем выборку двух таблиц Product и ProductInventory. Используется шаблон ADO.NET Entity Data Model.

    (рис 4.11) (рис 4.10) Создание класса сущностей с использованием шаблона ADO.NET Entity Data Model

    Теперь клиентское приложение через класс DomainService будет оперировать этими сущностями.

    Класс DomainService

    Создание класса DomainService на уровне бизнес-логики - ключевой момент при использовании .NET RIA сервисов. DomainService - это класс, который содержит сущности и операции. В нем же реализуется бизнес-логика приложения. В рамках .NET RIA сервисов содержится программный код, который делает сущности и операции доступными другим уровням приложения.

    Процесс создания класса DomainService показано на Рис. 4.12. Данный класс лежит в пространстве имен System.Web.DomainServices.

    (рис 4.13) Создание класса DomainService

    DataContext - данные класса AdventureWorks_DataEntities, сгенерированного ранее и содержащего методы работы с двумя таблицами Product и ProductInventory из демонстрационной базы данных AdventureWorks. Новый класс DomainService имеет следующие характеристики:

  • Класс происходит из класса LinqToEntitiesDomainService - абстрактного класса .NET RIA Services framework. NET RIA Services framework содержит базовые классы для Entity Framework и LINQ to SQL.
  • Класс привязан к классу данных AdventureWorks_DataEntities.
  • Класс DomainService помечен, как [EnableClientAccess()], чтобы клиентская часть его могла видеть.
  • Был сгенерирован метод GetProduct() для запроса к содержимому объекта Product класса AdventureWorks_DataEntities, т.е. фактически к данным таблицы Product, т.к. только сущность Product помечена галочкой и нет галочки "enable editing".
  • В этот новый класс DomainService помещается вся бизнес-логика приложения. Например, мы можем изменить метод GetProduct(), чтобы как-то отфильтровать данные. Или можно добавить в этот метод входной параметр для каких-либо целей обработки.

    Важным моментом является тот, что класс DomainService имеет публичный интерфейс ( public ) и доступен из других классов. В любом случае новый класс является стартовой точкой для расширения логики приложения. Но при этом сразу получается готовое работающее приложение, отображающее содержимое сущности Product.

    Доступ к данным со стороны клиента

    После компилирования веб-приложения с каталоге \Generated_Code появляется файл BusinessApplication1.Web.g.cs, содержащий прокси-класс public sealed partial class Product : Entity. Как видно является наследником класса Entity. И повторяет свойства сущностей класса DomainService. Важным аспектом генерации прокси-класса является:

  • Прокси-классы каждый раз генерируются заново, когда модифицируется класс DomainService и компилируется клиентское приложение. Это означает, что нельзя модифицировать этот класс, т.к. он будет перезаписан. Поэтому файл, содержащий класс, имеет атрибут "скрытый файл".
  • Отдельный прокси-класс для клиента генерируется для каждого отдельного класса DomainService
  • Класс DomainContext генерируется на клиенте для обеспечения доступа к операциям класса DomainService. В данном примере генерируется класс ProductContext, который имеет метод GetProductQuery(), который может быть использован как аргумент другого метода DomainContext.Load() , который вызывает метод GetProduct() класса ProductService DomainService, запрашивающий данные из базы данных. Класс DomainContext для каждого класса DomainService на сервере, который помечен атрибутом [EnableClientAccess()]
  • В примере показано как можно отобразить содержимое сущности Product элементом управления DataGrid. Файл MainPage.xaml содержит данный элемент управления.

    <data:DataGrid Name="TheDataGrid"></data:DataGrid>

    Файл кода (code behind) MainPage.xaml.cs содержит, следующий код:

    using SilverlightApplication1;
    using SilverlightApplication1.Web;
    using System.Windows.Ria.Data;
    
    namespace SilverlightApplication1
    {
      public partial class MainPage : UserControl
      {
        private ProductContext _productContext = new ProductContext();
        public MainPage()
        {
          InitializeComponent();
          LoadOperation<Product> loadOp =                   
                       this._productContext.Load(this._productContext.GetProductQuery());
          this.TheDataGrid.ItemsSource = loadOp.Entities;
          …

    После компиляции и запуска можно увидеть результат.

    (рис 4.12) Отображение сущности на клиенте Silverlight

    Выводы

    Ключевыми моментами использования .NET RIA сервисов и Silverlight являются:

  • Стандартное приложение Silverlight может быть легко преобразовано в многоуровневое с помощью установления связки "RIA link" между проектом Silverlight и веб-проектом.
  • Простейшая форма многоуровневого приложения состоит из двух отдельных проектов внутри одного решения, один проект - ASP.NET веб-приложение (бизнес логика, средний уровень), другой - приложение Silverlight (клиент).
  • Класс DomainService содержит набор сущностей и операций. Разработчикам следует располагать программный код с логикой приложения именно в этом классе.
  • При компиляции приложения генерируется прокси-класс на клиенте Silverlight, прокси-класс содержит помеченные атрибутом EnableClientAccess сущности класса DomainService.
  • Код клиента Silverlight взаимодействует с прокси-классом DomainContext, чтобы получать и манипулировать сущностями
  • И сервер и клиент взаимодействуют с общим набором сущностей, делая возможным использовать одну и ту же бизнес-логику и правила ввода текста всеми уровнями многоуровневого приложения.
  • Silverlight и Windows Presentation Foundation

    Основы Windows Presentation Foundation

    Windows Presentation Foundation (WPF) - это система нового поколения для построения Windows и веб приложений. Основа WPF - это независимый от разрешения экрана и основанный на векторной графике механизм прорисовки, который был построен для использования всех преимуществ современного графического оборудования. WPF расширяет эту основу исчерпывающим набором средств разработки приложений, включающих Язык XAML (Extensible Application Markup Language), элементы управления, привязку данных, структуру, графику двухмерный и трехмерный, анимацию, стили, шаблоны, документы, мультимедиа, текст и типографию. WPF включен в Microsoft .NET Framework, так что можно строить приложения, включающие другие элементы библиотеки классов .NET Framework. Для отображения элементов управления используется DirectX. Для описания язык XAML (eXtensible Application Markup Language). Это XML-подобный, декларативный язык, который описывает весь "контент" отображаемый подсистемой WPF. XAML включает основные четыре категории элементов: панели, элементы управления, элементы связанные с документом и графические фигуры.

    WPF существует в качестве подмножества типов .NET Framework, которые занимают большую часть в пространстве имен System.Windows. WPF предлагает дополнительные программные усовершенствования для разработки клиентских приложений Windows. Одним очевидным усовершенствованием является возможность разрабатывать приложения с помощью разметки и кода программной части. Разметка Язык XAML (Extensible Application Markup Language) обычно используется для реализации внешнего вида приложения при реализации его поведения с помощью управляемых языков программирования (кода программной части). При разделении внешнего вида и поведения разработка более эффективна, так как разработчики, реализующие внешний вид приложения, могут это делать одновременно с разработчиками, реализующими поведение приложения.Множество средств проектирования можно использовать для реализации и совместного использования разметки XAML, чтобы удовлетворить требованиям участников разработки приложения; Microsoft Expression Blend предназначен для конструкторов, в то время как Visual Studio 2005 ориентирован на разработчиков.

    XAML упрощает создание пользовательских интерфейсов для модели программирования .NET Framework. Можно создать элементы управления в декларативной разметке XAML, а затем отделить определение элемента управления от логики времени выполнения, используя файлы с выделенным кодом, присоединенные к разметке с помощью определений разделяемых классов. Возможность перемежать код и разметку в XAML важна, поскольку XML сам по себе является декларативным и реально не предлагает модель для управления размещением. Основанный на XML декларативный язык интуитивно понятен для создания интерфейсов в диапазоне от прототипа до производства, особенно для людей с опытом веб-разработки и работы с веб-технологиями. В отличие от большинства других языков разметки, XAML непосредственно представляет создание экземпляров управляемых объектов. Этот общий принцип проектирования ведет к упрощению кода и доступа отладки для объектов, создаваемых в XAML.

    Использование WPF существенно повышает производительность команды при разработке ПО за счет:

  • Декларативного программирования (XAML)
  • Дизайнер прозрачно интегрируется в процесс разработки приложения
  • Инструмент дизайнера: Microsoft Expression
  • Инструмент разработчика: Visual Studio
  • Создание браузерного приложения XAML

    В следующем примере с помощью XAML реализуется внешний вид окна, содержащего одну кнопку, нажатие которой выводит сообщение. Проект Visual Studio 2008 создается по шаблону WPF Browser Application. Содержимое файла Page1.xaml, Page1.xaml.cs (code behind) и результат выполнения приведены ниже.

    <Page x:Class="WpfBrowserApplication1.Page1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Page1" Height="100" Width="200">
      <Grid>
        <Button Name="button" Click="button_Click">
          Click Me!
        </Button>
      </Grid>
    </Page>
    
    private void button_Click(object sender, RoutedEventArgs e)
    {
      MessageBox.Show("Привет, Windows Presentation Foundation!");
    }
    (рис 4.14) Пример простого веб-приложения WPF

    Для приложений, размещенных в веб-обозревателе, также называемых XBAP (XAML browser applications - приложения обозревателя XAML), можно создавать страницы ( Page ) и функции страниц ( PageFunction<(Of <(T>)>) ); переходить между этими страницами можно с помощью гиперссылок (классы Hyperlink ).

    Развертывание браузерного приложения XAML

    При построении XBAP Visual Studio формирует следующие три файла:

  • Исполняемый файл. Он содержит скомпилированный код и имеет расширение .exe.
  • Манифест приложения. Содержит метаданные, связанные с приложением, и имеет расширение .manifest.
  • Манифест развертки. В этом файле содержатся сведения о том, что ClickOnce используется для развертывания приложения и имеет расширение .xbap.
  • Файлы *.xbap, *.exe и манифест помещаются на веб-сервере. На веб-странице создается гиперссылка, чтобы перейти в манифест развертывания. Когда пользователь щелкает ссылку и переходит к .xbap файлу, ClickOnce автоматически обрабатывает механизм загрузки и запуска приложения.

    Совпадения между WPF и Silverlight

    Silverlight считается подмножеством WPF.

    Silverlight и WPF имеют много одинаковых элементов управления. Тех, которых нет в дистрибутиве Silverlight, можно найти в Silverlight SDK или Silverlight Toolkit. Правда реализация этих элементов в большинстве случаев неодинакова. Microsoft стремится к максимальной похожести между элементами управления. Совпадения увеличиваются от версии к версии.

    И Silverlight, и WPF имеют механизм анимации с помощью линейной интерполяции. В WPF это можно сделать, используя триггеры, в Silverlight, используя VisualStateManager.

    И Silverlight, и WPF поддерживают создание специальных и пользовательских элементов управления (user control и custom control).

    Обе технологии позволяют проигрывать видео и аудио. Но WPF, при проигрывании, использует класс MediaElement медиапроигрывателя Windows Media Player клиента. Класс MediaPlayer в Silverlight не существует и поэтому используется класс MediaElement из Silverlight framework. Проигрыватель Silverlight полностью отделен от Windows Media Player клиента. Это приводит к тому, что не все кодеки поддерживаются.

    Обе технологии используют язык XAML для описания пользовательского интерфейса. Обе платформы поддерживают файл code-behind с программным .NET кодом, чтобы манипулировать элементами, указанными в XAML файле. Большая часть языка обоих платформ совпадают.

    Внешний вид приложений может быть очень похожим (см. рис. 4.15 и рис. 4.16).

    (рис 4.15) Пример реализации приложения с помощью WPF(рис 4.16) Пример реализации приложения с помощью Silverlight

    Различия между WPF и Silverlight

    Silverlight - основанная на XAML технология. Приложение Silverlight работает как плагин к браузеру и в песочнице браузера. WPF поддерживает ТОЛЬКО! платформу Windows, Silverlight - кросс-платформенная технология

    Архитектурные различия. Архитектура WPF аналогична архитектуре WinForms. Приложение WPF исполняется на платформе клиента и использует его .NET framework. Silverlight, будучи плагином и с целью снизить загрузку канала при установке Silverlight Tools, является дополнением к .NET framework. Это означает, что нельзя использовать одни и те же библиотеки в обоих платформах.

    Развертывание. Приложение Silverlight размещается (хостится) на веб-странице сайта. С целью уменьшений нагрузки на канал используется XAP файл, т.е. архивный *.zip файл. Его генерирует Visual Studio при компиляции проекта. WPF разворачивается как автономное приложение ClickOnce или XAML Browser. Приложение WPF (3 ранее упомянутых файла) полностью загружается на клиентский компьютер перед началом его выполнения. Важным аспектом производительности XBAP является его время запуска. Если XBAP является первым загружаемым приложением WPF, время холодного запуска может составить десять или больше секунд. Это связано с тем, что WPF выполняет прорисовку страницы хода выполнения, но для ее отображения должен быть выполнен холодный запуск среды CLR и WPF. Приложение Silverlight начинает выполняться быстрее, т.к. загружает только выполняемый в данный момент код.

    BAML/XAML. BAML - бинарная форма XAML. Бинарная форма повышает производительность. Ее использует WPF приложение. Silverlight использует только XAML. Хотя языки в большинстве случаев совпадают, но есть много различий при работе с элементами управления, используемыми в двух платформах. Элементы управления разные, поэтому и параметры их разные. Например, Silverlight требует, чтобы корневой элемент содержал пространство имен xmlns, тогда как WPF поддерживает неявное задание пространства.

    <UserControl
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    …

    References. Если необходимо задать ссылку на некую сборку, то в Silverlight это делается в заголовке, а WPF может использовать GAC. Ниже приведены другие примеры различий либо в описании, либо в коде и в описании.

    WPF
    <Style x:Key="MyButtonStyle" TargetType="{x:Type Button}"/>
    Silverlight
    <Style x:Key="MyButtonStyle" TargetType="Button"/>
    WPF
    <Rectangle x:Name="MyShape"
        SnapsToDevicePixels="True"/>
    
        this.MyShape.SnapsToDevicePixels = true;
    Silverlight
    <Rectangle x:Name="MyShape"
        UseLayoutRounding="True"/>
        this.MyShape.UseLayoutRounding = true;

    Обработчик событий. Множество взаимодействий между клиентом и сервером осуществляется с помощью обработчика событий event. В WPF и Silverlight большинство событий маршрутизируемые Routed Events.

    public delegate void RoutedEventHandler( Object sender, RoutedEventArgs e )

    Но обработчику события передаются разные параметры (см. табл. 4.1).

    Различия WPF и Silverlight. RoutedEventArgs
    Свойство WPF Silverlight
    Device Да Нет
    Handled Да Да
    InputSource Да Нет
    OriginalSource Да Да
    RoutedEvent Да Нет
    Source Да Нет
    Timestamp Да Нет

    По-разному две технологии реагируют на нажатие клавиш и мыши.

    public delegate void KeyEventHandler( Object sender, KeyEventArgs e )
    Различия WPF и Silverlight. KeyEventArgs
    Свойство WPF Silverlight
    ImeProcessedKey Да Нет
    IsDown Да Нет
    IsRepeat Да Нет
    IsToggled Да Нет
    IsUp Да Нет
    Key Да Да
    KeyboardDevice Да Нет
    KeyStates Да Нет
    SystemKey Да Нет
    PlatformKeyCode Нет Да
    public delegate void MouseButtonEventHandler(Object sender, MouseButtonEventArgs e)
    public delegate void MouseEventHandler(Object sender, MouseEventArgs e)
    public delegate void MouseWheelEventHandler(Object sender, MouseWheelEventArgs e)
    Различия WPF и Silverlight. MouseButtonEventArgs, MouseEventArgs, MouseWheelEventArgs
    Свойство WPF Silverlight
    LostMouseCapture Да Да
    MouseDoubleClick Да Нет
    MouseDown Да Да
    MouseEnter Да Да
    MouseLeave Да Да
    MouseLeftButtonDown Да Да
    MouseLeftButtonUp Да Да
    MouseMove Да Да
    MouseRightButtonDown Да Нет
    MouseRightButtonUp Да Нет
    MouseUp Да Нет
    MouseWheel Да Нет
    PreviewMouseDoubleClick Да Нет
    PreviewMouseDown Да Нет
    PreviewMouseLeftButtonDown Да Нет
    PreviewMouseLeftButtonUp Да Нет
    PreviewMouseMove Да Нет
    PreviewMouseRightButtonDown Да Нет
    PreviewMouseRightButtonUp Да Нет

    Доступ к локальным файлам. WPF имеет практически неограниченный доступ к локальным ресурсам. В то время как Silverlight имеет множество ограничений и использует OpenFileDialog элемент управления браузера. Соответственно браузер может и не разрешить это делать. Записывать данные ( SaveFileDialog ) Silverlight может только в изолированное хранилище на диске. В будущем это будет исправлено.

    Шрифты. WPF использует набор шрифтов операционной системы клиента. Silverlight поддерживает стандартный ограниченный набор и, в случае необходимости, подгружает их или содержит в файле *.ttf архива *.xap. Во 2-й версии Silverlight были доступны шрифты: Arial, Arial Black, Comic Sans MS, Courier New, Georgia, Lucinda Grande / Lucida Sans Unicode, Times New Roman, Trebuchet MS, Verdana. В третьей версии их около 230.

    <TextBlock 
    FontFamily="customfont.ttf#Custom Font">
      Text
    </TextBlock>

    Набор элементов управления. WPF и Silverlight часто используют разные элементы управления. В Silverlight 3 доступно 79 элементов.

    Различия WPF и Silverlight. Элементы управления
    Элемент управления WPF Silverlight
    AccessText Да Нет
    AdornedElementPlaceholder Да Нет
    AdornerDecorator Да Нет
    AutoCompleteBox Нет Toolkit
    Border Да Да
    BulletChrome Да Нет
    BulletDecorator Да Нет
    Button Да Да
    ButtonChrome Да Нет
    Calendar Да SDK
    Canvas Да Да
    CheckBox Да Да
    ClassicBorderDecorator Да Нет
    ComboBox Да Да
    ComboBoxItem Да Да
    ContentControl Да Да
    ContentPresenter Да Да
    ContextMenu Да Нет
    Control Да SDK
    DataGrid Да SDK
    DatePicker Да SDK
    Decorator Да Нет
    DockPanel Да Toolkit
    DocumentPageView Да Нет
    DocumentReference Да Нет
    DocumentViewer Да Нет
    Ellipse Да SDK
    Expander Да Toolkit
    FixedPage Да Нет
    FlowDocumentPageViewer Да Нет
    FlowDocumentReader Да Нет
    FlowDocumentScrollViewer Да Нет
    Frame Да Нет
    FrameworkElement Да Нет
    Glyphs Да Нет
    Grid Да Да
    GridSplitter Да SDK
    GridViewColumnHeader Да Нет
    GridViewHeaderRowPresenter Да Нет
    GridViewRowPresenter Да Нет
    GroupBox Да Нет
    GroupItem Да Нет
    HeaderedContentControl Да Toolkit
    HeaderedItemsControl Да Toolkit
    HyperlinkButton Нет Да
    Image Да Да
    ImplicitStyleManager Да Toolkit
    InkCanvas Да Нет
    InkPresenter Да Да
    ItemsControl Да Да
    ItemsPresenter Да Да
    Label Да Toolkit
    Line Да Да
    ListBox Да Да
    ListBoxChrome Да Нет
    ListBoxItem Да Нет
    ListView Да Нет
    ListViewItem Да Нет
    MediaElement Да Да
    Menu Да Нет
    MenuItem Да Нет
    MultiScaleImage Нет Да
    NavagationWindow Да Нет
    NumericUpDown Нет Toolkit
    Page Да Нет
    PageContent Да Нет
    PageFunction Да Нет
    PasswordBox Да Да
    Path Да Да
    Polygon Да Да
    Polyline Да Да
    Popup Да Да
    ProgressBar Да Да
    RadioButton Да Да
    Rectangle Да Да
    RepeatButton Да Да
    ResizeGrip Да Нет
    Ribbon Да Нет
    RibbonWindow Да Нет
    RichTextBox Да Нет
    ScrollBar Да Да
    ScrollChrome Да Нет
    ScrollContentPresenter Да Да
    ScrollViewer Да Да
    Separator Да Нет
    Slider Да Да
    StackPanel Да Да
    StatusBar Да Нет
    StatusBarItem Да Нет
    SystemDropShadowChrome Да Нет
    TabControl Да SDK
    TabItem Да SDK
    TabPanel Да Нет
    TextBlock Да Да
    TextBox Да Да
    Thumb Да Да
    TickBar Да Нет
    ToggleButton Да Да
    ToolBar Да Нет
    ToolBarOverflowPanel Да Нет
    ToolBarPanel Да Нет
    ToolBarTray Да Нет
    ToolTip Да Да
    Track Да Нет
    TreeView Да Toolkit
    TreeViewItem Да Toolkit
    UniformGrid Да Нет
    UserControl Да Да
    ViewBox Да Toolkit
    Viewport3D Да Нет
    VirtualizingStackPanel Да Нет
    WebBrowser Да Нет
    Window Да Нет
    WindowsFormsHost Да Нет
    WrapPanel Да Toolkit

    Farmework. Silverlight framework и .NET framework, используемый WPF имеют ряд отличий.

    Различия WPF и Silverlight. Коллекции
    Класс WPF Silverlight
    System.Collection
    ArrayList Да Нет
    BitArray Да Да
    HashTable Да Нет
    Queue Да Нет
    SortedList Да Нет
    Stack Да Нет
    System.Collection.Generic
    Dictionary<TKey, TValue> Да Да
    KeyedByTypeCollection<TItem> Да Да
    HashSet<T> Да Нет
    LinkedList<T> Да Да
    List<T> Да Да
    Queue<T> Да Да
    SortedDictionary<TKey, TValue> Да Нет
    SortedList<T> Да Нет
    Stack<T> Да Да
    SynchronizedCollection<T> Да Нет

    Различаются также сетевые, шифровальные возможности, возможности создания потоков, блокировок, 3D графики, стилей, тем, валидаторов.

    Уникальные возможности

    Есть вещи, которые поддерживает только одна из технологий.

    WPF.

    В WPF в отличие от Silverlight имеются функции печати, синтезатора речи, распознавания речи и др., поддержка тем и скинов (skins), "горячие клавиши".

    Silverlight. (подробнее см. раздел )

  • Приложению Silverlight не обязательно перегружать целую страницу для изменения одной ее части. Silverlight может вызывать методы JavaScript и наоборот и взаимодействовать с HTML document object model (DOM).

    Вызов методов JavaScript из кода

    using System.Windows.Browser;
    // call a method 
    HtmlPage.Window.Eval("customMethod();"); 
    // use invoke syntax 
    HtmlPage.Window.Invoke("customMethod"); 
    // use invoke syntax with parameters 
    HtmlPage.Window.Invoke("customMethod", "param1", 12); 
    // use invoke syntax and get return value. 
    string name = (string) HtmlPage.Window.Invoke("getName");

    Вызов методов кода из JavaScript (в коде необходимо указать атрибуты [ScriptableType] перед классом и [ScriptableMember] перед методом)

    <script type="text/JavaScript"> 
    function onPluginLoaded() 
    { 
      var sl = $get("Xaml1"); // Use ID associated with plugin. 
      var sm = sl.content.SilverlightMethods;
      var name = sm.GetUserName(); // Case sensitive. 
    } 
    </script>
  • Поддержка высококачественного видео и звука на базе технологии Smooth Streaming: качество картинки меняется автоматически в режиме реального времени в зависимости от скорости передачи данных и мощности компьютера пользователя (подробно в разделе ).
  • Работа с фотографиями на базе технологии Deep Zoom: технология усиленного масштабирования Deep Zoom предлагает новый стандарт просмотра и создания изображений со сверхвысоким разрешением, обеспечивая плавное и точное масштабирование и панаромирование (подробно в разделе )
  • Триггеры

    WPF и Silverlight 3 поддерживают триггеры. Кроме триггеров Silverlight поддерживает Visual State Manager. В будущих реализациях в WPF также будет класс Visual State Manager, увеличивая сходство обеих технологий.

    В настоящее время Silverlight XAML поддерживает только один тип триггеров - EventTrigger. Каждое свойство пользовательского интерфейса имеет коллекцию Triggers, которая используется для определения одного или более триггеров (т.е. одного или более объектов EventTrigger ). Итак, первый шаг в добавлении триггера в элемент управления - создание его коллекции триггеров. Затем в эту коллекцию необходимо будет добавить, по крайней мере, один триггер события. Например, если необходимо при загрузке страницы добавить анимацию, то это выглядит следующим образом:

    <Rectangle x:Name="MyAnimatedRectangle"
               Width="100"
               Height="100"
               Fill="Blue">
      <Rectangle.Triggers>
        <EventTrigger RoutedEvent="Rectangle.Loaded">
          <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation Storyboard.TargetName="MyAnimatedRectangle"
                     Storyboard.TargetProperty="Opacity"
                     From="1.0" 
                     To="0.0" 
                     Duration="0:0:5" 
                     AutoReverse="True" 
                     RepeatBehavior="Forever" />
            </Storyboard>
          </BeginStoryboard>
        </EventTrigger>
      </Rectangle.Triggers>
    </Rectangle>

    Данный код выводит квадрат синего цвета, затем за 5 секунд квадрат становится прозрачным. Код полностью одинаков как для приложения Silverlight, так и для WPF.

    (рис 4.16 ) Триггеры в Silverlight(рис 4.17 ) Триггеры в WPF

    Стратегия повторного использования кода

    Совместное использование кода WPF и Silverlight кажется невозможной задачей, учитывая многочисленные отличия. Но при аккуратном планировании разработчик все таки может значительную часть кода использовать одновременно в обеих технологиях. Silverlight становится ближе к WPF с каждым следующим релизом. Ниже приведены некоторые техники для сближения кода.

    Пользовательские элементы управления. Это один из способов совместного использования кода. Элементы управления построенные полностью на коде C# будут полностью совместимы. XAML код также можно сделать максимально похожим.

    Классы Partial. С помощью таких классов можно организовать целый класс, определение которого хранится в нескольких файлах. Можно класс организовывать из трех файлов. В одном содержится общий код для обеих платформ, во втором уникальный код для Silverlight, в третьем уникальный код для WPF. Таким образом, проект Silverlight будет содержать 1-й и 2-й файлы, а проект WPF 1-й и 3-й.

    Директивы компилятору. Использование условных директив компилятору позволит иметь в сборке только нужные фрагменты кода:

    #if SILVERLIGHT 
      <код для Silverlight > 
    #else 
      < код для > 
    #endif

    Ссылки на файлы. Можно файл *.cs одного проекта использовать в другом, подключив его как ссылку.

    Выводы

    WPF и Silverlight создают новую парадигму в разработке приложений, используя одну и туже базовую технологию декларативного программирования и модель code-behind для процедурного программирования. Silverlight считается подразделом WPF и постоянно приближается к нему с каждым следующим релизом. Несмотря на это Silverlight остается плагином к браузеру, что накладывает особый подход к программированию и архитектуре.

    Страницы:

    Rich Internet Application (RIA) - это особый класс веб-приложений. RIA приложения позволяют делать богатый пользовательский интерфейс, но без необходимости перегрузок страниц, как в обычных веб-приложениях. Типовая архитектура таких приложений приведена на рис. 4.1

    (рис 4.1) Архитектура RIA приложений

    Обычно приложение состоит из серверной части, где размещены веб-сервисы, бизнес-логика, СУБД. Клиентская часть может быть HTML+Ajax или Silverlight. Мы будем рассматривать в контексте Silverlight. По сети части взаимодействуют по протоколам SOAP или REST (см. Работа Silverlight с web сервисами).

    В обычном бизнес приложении уровни клиента и сервера разъединены и независимо разрабатываются. Но в RIA приложениях две части разрабатываются как одно приложение. Такую возможность дают .NET RIA сервисы. RIA сервисы не входят в состав Silverlight 3 и доступны для скачивания по адресу: http://www.microsoft.com/downloads/details.aspx?FamilyID=76bb3a07-3846-4564-b0c3-27972bcaabcedisplaylang=en

    .NET RIA сервисы упрощают разработку многоуровневых приложений объединяя платформы ASP.NET и Silverlight. Логика приложения располагается на среднем уровне и отвечает за запросы, изменения данных и прочие методы. .NET RIA сервисы автоматически генерируют прокси-классы для клиента, чтобы тот мог использовать их в этих операциях. И так как на уровнях логики и клиента сервисы работают с одной средой выполнения CLR (Common Language Runtime), разработчик может писать код, работающий на обоих уровнях. Использование .NET RIA сервисов стирает грань между разработкой клиентской и серверной частями и позволяет разрабатывать обе части, как одно приложение.

    В общем .NET RIA сервисы могут использоваться не только с Silverlight, но и с другими технологиями написания клиентской части (Рис. 4.2). В любом случае бизнес-логика приложения будет передаваться через прокси-классы клиенту.

    (рис 4.2) Возможности . NET RIA сервисов

    Создание приложений с .NET RIA сервисами

    На Рис. 4.3 показан процесс создания приложения Silverlight с поддержкой .NET RIA сервисов в Visual Studio 2008.

    затем

    (рис 4.3) Создание проекта Silverlight и .NET RIA Services

    Есть возможность изменить существующий проект Silverlight, для того чтобы тот мог работать с .NET RIA сервисами. Автоматически в references проекта добавится ссылка на библиотеку System.Windows.Ria.

    (рис 4.4) Изменение свойств проекта Silverlight для работы с .NET RIA сервисами

    http://www.silverlightshow.net/AWWeb/AdventureWorksLOB.aspx - пример бизнес-приложения, использующего .NET RIA сервисы

    (рис 4.5) Пример бизнес-приложения Silverlight, использующего .NET RIA сервисы

    В примере виден список товаров, возможна сортировка (List price), группировка (Category), поиск, постраничный вывод.

    Преимущества для клиента при использовании .NET RIA сервисов.

    Ключевыми моментами создания многоуровневых приложений с использованием .NET RIA сервисов являются:

  • Стандартное приложение Silverlight может быть трансформировано в многоуровневое с помощью линка RIA link между проектом Silverlight и веб-проектом.
  • Простейшее многоуровневое приложение состоит из 2-х отдельных проектов внутри одного решения (solution), один из них проект ASP.NET (уровень бизнес-логики), а другой - приложение Silverlight (клиент).
  • Класс DomainService в серверном проекте располагает набором сущностей и операций, свойственных определенному домену. Разработчик помещает логику приложения в этот класс.
  • Когда решение скомпилировано, прокси-класс для клиента генерируется автоматически для проекта Silverlight, согласно сущностям и операциям, определенных классом DomainService.
  • Клиент Silverlight взаимодействует со сгенерированным кодом прокси-класса DomainContext для получения и манипулирования соответствующими сущностями.
  • И сервер и клиент работают с одним и тем же набором сущностей, делая возможным прозрачно использовать бизнес-логику и правила ввода данных на всех уровнях.
  • Преимуществами для клиента при использовании .NET RIA сервисов являются:

  • Навигация по страницам с помощью кнопок браузера "вперед" и "назад". Заголовок страницы изменяется во время навигации.
  • Проверка правильности ввода (валидация) данных на клиенте.
  • Фильтрация, сортировка, разбиение на страницы - осуществляется декларативно
  • Создание окон в рамках Silverlight 3 приложения - необходимая функция для бизнес-приложений
  • Обеспечение безопасности через [RequiresAuthentication] - атрибут метода или свойства
  • Любые источники данных ADO.NET, SOAP|REST, LINQ, SQL Server
  • Полное тестирование кода (unit test)
  • Добавление любых бизнес-операций
  • Шаблон "Silverlight Business Application"

    Шаблон Silverlight Business Application Template дает возможность начать разработку бизнес приложения Silverlight с .NET RIA сервисами, которое поддерживает аутентификацию и регистрацию пользователей.

    (рис 4.6) Шаблон Silverlight Business Application(рис 4.7) Проект, созданный по шаблону Silverlight Business Application

    По шаблону создаются приложение и приложение ASP.NET, которое хостит приложение Siverlight. Автоматически создается ссылка на .NET RIA сервисы. Создается решение с двумя проектами:

  • MyBusinessApplication - проект, содержащий код Siverlight. Это клиентская часть.
  • MyBusinessApplication.Web - проект, содержащий код веб-приложения ASP.NET. Это средний уровень, уровень сервера.
  • Ниже приведена работа приложения, а именно шаблонные аутентификация и регистрация.

    (рис 4.8) Аутентификация пользователя в шаблоне Silverlight Business Application(рис 4.9) Регистрация нового пользователя в шаблоне Silverlight Business Application

    Сущности

    При создании бизнес-приложения всегда имеется подключение к базе данных. Оно происходит на уровне сервера приложений. Для этого необходимо создать класс, например, AdventureWorks_DataEntities. Клиентская часть к базе данных напрямую не обращается, только через этот класс, который оперирует понятиями сущностей ( Entity ).

    Например, мы получаем доступ к базе данных AdventureWorks с помощью Entity Framework и делаем выборку двух таблиц Product и ProductInventory. Используется шаблон ADO.NET Entity Data Model.

    (рис 4.11) (рис 4.10) Создание класса сущностей с использованием шаблона ADO.NET Entity Data Model

    Теперь клиентское приложение через класс DomainService будет оперировать этими сущностями.

    Класс DomainService

    Создание класса DomainService на уровне бизнес-логики - ключевой момент при использовании .NET RIA сервисов. DomainService - это класс, который содержит сущности и операции. В нем же реализуется бизнес-логика приложения. В рамках .NET RIA сервисов содержится программный код, который делает сущности и операции доступными другим уровням приложения.

    Процесс создания класса DomainService показано на Рис. 4.12. Данный класс лежит в пространстве имен System.Web.DomainServices.

    (рис 4.13) Создание класса DomainService

    DataContext - данные класса AdventureWorks_DataEntities, сгенерированного ранее и содержащего методы работы с двумя таблицами Product и ProductInventory из демонстрационной базы данных AdventureWorks. Новый класс DomainService имеет следующие характеристики:

  • Класс происходит из класса LinqToEntitiesDomainService - абстрактного класса .NET RIA Services framework. NET RIA Services framework содержит базовые классы для Entity Framework и LINQ to SQL.
  • Класс привязан к классу данных AdventureWorks_DataEntities.
  • Класс DomainService помечен, как [EnableClientAccess()], чтобы клиентская часть его могла видеть.
  • Был сгенерирован метод GetProduct() для запроса к содержимому объекта Product класса AdventureWorks_DataEntities, т.е. фактически к данным таблицы Product, т.к. только сущность Product помечена галочкой и нет галочки "enable editing".
  • В этот новый класс DomainService помещается вся бизнес-логика приложения. Например, мы можем изменить метод GetProduct(), чтобы как-то отфильтровать данные. Или можно добавить в этот метод входной параметр для каких-либо целей обработки.

    Важным моментом является тот, что класс DomainService имеет публичный интерфейс ( public ) и доступен из других классов. В любом случае новый класс является стартовой точкой для расширения логики приложения. Но при этом сразу получается готовое работающее приложение, отображающее содержимое сущности Product.

    Доступ к данным со стороны клиента

    После компилирования веб-приложения с каталоге \Generated_Code появляется файл BusinessApplication1.Web.g.cs, содержащий прокси-класс public sealed partial class Product : Entity. Как видно является наследником класса Entity. И повторяет свойства сущностей класса DomainService. Важным аспектом генерации прокси-класса является:

  • Прокси-классы каждый раз генерируются заново, когда модифицируется класс DomainService и компилируется клиентское приложение. Это означает, что нельзя модифицировать этот класс, т.к. он будет перезаписан. Поэтому файл, содержащий класс, имеет атрибут "скрытый файл".
  • Отдельный прокси-класс для клиента генерируется для каждого отдельного класса DomainService
  • Класс DomainContext генерируется на клиенте для обеспечения доступа к операциям класса DomainService. В данном примере генерируется класс ProductContext, который имеет метод GetProductQuery(), который может быть использован как аргумент другого метода DomainContext.Load() , который вызывает метод GetProduct() класса ProductService DomainService, запрашивающий данные из базы данных. Класс DomainContext для каждого класса DomainService на сервере, который помечен атрибутом [EnableClientAccess()]
  • В примере показано как можно отобразить содержимое сущности Product элементом управления DataGrid. Файл MainPage.xaml содержит данный элемент управления.

    <data:DataGrid Name="TheDataGrid"></data:DataGrid>

    Файл кода (code behind) MainPage.xaml.cs содержит, следующий код:

    using SilverlightApplication1;
    using SilverlightApplication1.Web;
    using System.Windows.Ria.Data;
    
    namespace SilverlightApplication1
    {
      public partial class MainPage : UserControl
      {
        private ProductContext _productContext = new ProductContext();
        public MainPage()
        {
          InitializeComponent();
          LoadOperation<Product> loadOp =                   
                       this._productContext.Load(this._productContext.GetProductQuery());
          this.TheDataGrid.ItemsSource = loadOp.Entities;
          …

    После компиляции и запуска можно увидеть результат.

    (рис 4.12) Отображение сущности на клиенте Silverlight

    Выводы

    Ключевыми моментами использования .NET RIA сервисов и Silverlight являются:

  • Стандартное приложение Silverlight может быть легко преобразовано в многоуровневое с помощью установления связки "RIA link" между проектом Silverlight и веб-проектом.
  • Простейшая форма многоуровневого приложения состоит из двух отдельных проектов внутри одного решения, один проект - ASP.NET веб-приложение (бизнес логика, средний уровень), другой - приложение Silverlight (клиент).
  • Класс DomainService содержит набор сущностей и операций. Разработчикам следует располагать программный код с логикой приложения именно в этом классе.
  • При компиляции приложения генерируется прокси-класс на клиенте Silverlight, прокси-класс содержит помеченные атрибутом EnableClientAccess сущности класса DomainService.
  • Код клиента Silverlight взаимодействует с прокси-классом DomainContext, чтобы получать и манипулировать сущностями
  • И сервер и клиент взаимодействуют с общим набором сущностей, делая возможным использовать одну и ту же бизнес-логику и правила ввода текста всеми уровнями многоуровневого приложения.
  • Silverlight и Windows Presentation Foundation

    Основы Windows Presentation Foundation

    Windows Presentation Foundation (WPF) - это система нового поколения для построения Windows и веб приложений. Основа WPF - это независимый от разрешения экрана и основанный на векторной графике механизм прорисовки, который был построен для использования всех преимуществ современного графического оборудования. WPF расширяет эту основу исчерпывающим набором средств разработки приложений, включающих Язык XAML (Extensible Application Markup Language), элементы управления, привязку данных, структуру, графику двухмерный и трехмерный, анимацию, стили, шаблоны, документы, мультимедиа, текст и типографию. WPF включен в Microsoft .NET Framework, так что можно строить приложения, включающие другие элементы библиотеки классов .NET Framework. Для отображения элементов управления используется DirectX. Для описания язык XAML (eXtensible Application Markup Language). Это XML-подобный, декларативный язык, который описывает весь "контент" отображаемый подсистемой WPF. XAML включает основные четыре категории элементов: панели, элементы управления, элементы связанные с документом и графические фигуры.

    WPF существует в качестве подмножества типов .NET Framework, которые занимают большую часть в пространстве имен System.Windows. WPF предлагает дополнительные программные усовершенствования для разработки клиентских приложений Windows. Одним очевидным усовершенствованием является возможность разрабатывать приложения с помощью разметки и кода программной части. Разметка Язык XAML (Extensible Application Markup Language) обычно используется для реализации внешнего вида приложения при реализации его поведения с помощью управляемых языков программирования (кода программной части). При разделении внешнего вида и поведения разработка более эффективна, так как разработчики, реализующие внешний вид приложения, могут это делать одновременно с разработчиками, реализующими поведение приложения.Множество средств проектирования можно использовать для реализации и совместного использования разметки XAML, чтобы удовлетворить требованиям участников разработки приложения; Microsoft Expression Blend предназначен для конструкторов, в то время как Visual Studio 2005 ориентирован на разработчиков.

    XAML упрощает создание пользовательских интерфейсов для модели программирования .NET Framework. Можно создать элементы управления в декларативной разметке XAML, а затем отделить определение элемента управления от логики времени выполнения, используя файлы с выделенным кодом, присоединенные к разметке с помощью определений разделяемых классов. Возможность перемежать код и разметку в XAML важна, поскольку XML сам по себе является декларативным и реально не предлагает модель для управления размещением. Основанный на XML декларативный язык интуитивно понятен для создания интерфейсов в диапазоне от прототипа до производства, особенно для людей с опытом веб-разработки и работы с веб-технологиями. В отличие от большинства других языков разметки, XAML непосредственно представляет создание экземпляров управляемых объектов. Этот общий принцип проектирования ведет к упрощению кода и доступа отладки для объектов, создаваемых в XAML.

    Использование WPF существенно повышает производительность команды при разработке ПО за счет:

  • Декларативного программирования (XAML)
  • Дизайнер прозрачно интегрируется в процесс разработки приложения
  • Инструмент дизайнера: Microsoft Expression
  • Инструмент разработчика: Visual Studio
  • Создание браузерного приложения XAML

    В следующем примере с помощью XAML реализуется внешний вид окна, содержащего одну кнопку, нажатие которой выводит сообщение. Проект Visual Studio 2008 создается по шаблону WPF Browser Application. Содержимое файла Page1.xaml, Page1.xaml.cs (code behind) и результат выполнения приведены ниже.

    <Page x:Class="WpfBrowserApplication1.Page1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Page1" Height="100" Width="200">
      <Grid>
        <Button Name="button" Click="button_Click">
          Click Me!
        </Button>
      </Grid>
    </Page>
    
    private void button_Click(object sender, RoutedEventArgs e)
    {
      MessageBox.Show("Привет, Windows Presentation Foundation!");
    }
    (рис 4.14) Пример простого веб-приложения WPF

    Для приложений, размещенных в веб-обозревателе, также называемых XBAP (XAML browser applications - приложения обозревателя XAML), можно создавать страницы ( Page ) и функции страниц ( PageFunction<(Of <(T>)>) ); переходить между этими страницами можно с помощью гиперссылок (классы Hyperlink ).

    Развертывание браузерного приложения XAML

    При построении XBAP Visual Studio формирует следующие три файла:

  • Исполняемый файл. Он содержит скомпилированный код и имеет расширение .exe.
  • Манифест приложения. Содержит метаданные, связанные с приложением, и имеет расширение .manifest.
  • Манифест развертки. В этом файле содержатся сведения о том, что ClickOnce используется для развертывания приложения и имеет расширение .xbap.
  • Файлы *.xbap, *.exe и манифест помещаются на веб-сервере. На веб-странице создается гиперссылка, чтобы перейти в манифест развертывания. Когда пользователь щелкает ссылку и переходит к .xbap файлу, ClickOnce автоматически обрабатывает механизм загрузки и запуска приложения.

    Совпадения между WPF и Silverlight

    Silverlight считается подмножеством WPF.

    Silverlight и WPF имеют много одинаковых элементов управления. Тех, которых нет в дистрибутиве Silverlight, можно найти в Silverlight SDK или Silverlight Toolkit. Правда реализация этих элементов в большинстве случаев неодинакова. Microsoft стремится к максимальной похожести между элементами управления. Совпадения увеличиваются от версии к версии.

    И Silverlight, и WPF имеют механизм анимации с помощью линейной интерполяции. В WPF это можно сделать, используя триггеры, в Silverlight, используя VisualStateManager.

    И Silverlight, и WPF поддерживают создание специальных и пользовательских элементов управления (user control и custom control).

    Обе технологии позволяют проигрывать видео и аудио. Но WPF, при проигрывании, использует класс MediaElement медиапроигрывателя Windows Media Player клиента. Класс MediaPlayer в Silverlight не существует и поэтому используется класс MediaElement из Silverlight framework. Проигрыватель Silverlight полностью отделен от Windows Media Player клиента. Это приводит к тому, что не все кодеки поддерживаются.

    Обе технологии используют язык XAML для описания пользовательского интерфейса. Обе платформы поддерживают файл code-behind с программным .NET кодом, чтобы манипулировать элементами, указанными в XAML файле. Большая часть языка обоих платформ совпадают.

    Внешний вид приложений может быть очень похожим (см. рис. 4.15 и рис. 4.16).

    (рис 4.15) Пример реализации приложения с помощью WPF(рис 4.16) Пример реализации приложения с помощью Silverlight

    Различия между WPF и Silverlight

    Silverlight - основанная на XAML технология. Приложение Silverlight работает как плагин к браузеру и в песочнице браузера. WPF поддерживает ТОЛЬКО! платформу Windows, Silverlight - кросс-платформенная технология

    Архитектурные различия. Архитектура WPF аналогична архитектуре WinForms. Приложение WPF исполняется на платформе клиента и использует его .NET framework. Silverlight, будучи плагином и с целью снизить загрузку канала при установке Silverlight Tools, является дополнением к .NET framework. Это означает, что нельзя использовать одни и те же библиотеки в обоих платформах.

    Развертывание. Приложение Silverlight размещается (хостится) на веб-странице сайта. С целью уменьшений нагрузки на канал используется XAP файл, т.е. архивный *.zip файл. Его генерирует Visual Studio при компиляции проекта. WPF разворачивается как автономное приложение ClickOnce или XAML Browser. Приложение WPF (3 ранее упомянутых файла) полностью загружается на клиентский компьютер перед началом его выполнения. Важным аспектом производительности XBAP является его время запуска. Если XBAP является первым загружаемым приложением WPF, время холодного запуска может составить десять или больше секунд. Это связано с тем, что WPF выполняет прорисовку страницы хода выполнения, но для ее отображения должен быть выполнен холодный запуск среды CLR и WPF. Приложение Silverlight начинает выполняться быстрее, т.к. загружает только выполняемый в данный момент код.

    BAML/XAML. BAML - бинарная форма XAML. Бинарная форма повышает производительность. Ее использует WPF приложение. Silverlight использует только XAML. Хотя языки в большинстве случаев совпадают, но есть много различий при работе с элементами управления, используемыми в двух платформах. Элементы управления разные, поэтому и параметры их разные. Например, Silverlight требует, чтобы корневой элемент содержал пространство имен xmlns, тогда как WPF поддерживает неявное задание пространства.

    <UserControl
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    …

    References. Если необходимо задать ссылку на некую сборку, то в Silverlight это делается в заголовке, а WPF может использовать GAC. Ниже приведены другие примеры различий либо в описании, либо в коде и в описании.

    WPF
    <Style x:Key="MyButtonStyle" TargetType="{x:Type Button}"/>
    Silverlight
    <Style x:Key="MyButtonStyle" TargetType="Button"/>
    WPF
    <Rectangle x:Name="MyShape"
        SnapsToDevicePixels="True"/>
    
        this.MyShape.SnapsToDevicePixels = true;
    Silverlight
    <Rectangle x:Name="MyShape"
        UseLayoutRounding="True"/>
        this.MyShape.UseLayoutRounding = true;

    Обработчик событий. Множество взаимодействий между клиентом и сервером осуществляется с помощью обработчика событий event. В WPF и Silverlight большинство событий маршрутизируемые Routed Events.

    public delegate void RoutedEventHandler( Object sender, RoutedEventArgs e )

    Но обработчику события передаются разные параметры (см. табл. 4.1).

    Различия WPF и Silverlight. RoutedEventArgs
    Свойство WPF Silverlight
    Device Да Нет
    Handled Да Да
    InputSource Да Нет
    OriginalSource Да Да
    RoutedEvent Да Нет
    Source Да Нет
    Timestamp Да Нет

    По-разному две технологии реагируют на нажатие клавиш и мыши.

    public delegate void KeyEventHandler( Object sender, KeyEventArgs e )
    Различия WPF и Silverlight. KeyEventArgs
    Свойство WPF Silverlight
    ImeProcessedKey Да Нет
    IsDown Да Нет
    IsRepeat Да Нет
    IsToggled Да Нет
    IsUp Да Нет
    Key Да Да
    KeyboardDevice Да Нет
    KeyStates Да Нет
    SystemKey Да Нет
    PlatformKeyCode Нет Да
    public delegate void MouseButtonEventHandler(Object sender, MouseButtonEventArgs e)
    public delegate void MouseEventHandler(Object sender, MouseEventArgs e)
    public delegate void MouseWheelEventHandler(Object sender, MouseWheelEventArgs e)
    Различия WPF и Silverlight. MouseButtonEventArgs, MouseEventArgs, MouseWheelEventArgs
    Свойство WPF Silverlight
    LostMouseCapture Да Да
    MouseDoubleClick Да Нет
    MouseDown Да Да
    MouseEnter Да Да
    MouseLeave Да Да
    MouseLeftButtonDown Да Да
    MouseLeftButtonUp Да Да
    MouseMove Да Да
    MouseRightButtonDown Да Нет
    MouseRightButtonUp Да Нет
    MouseUp Да Нет
    MouseWheel Да Нет
    PreviewMouseDoubleClick Да Нет
    PreviewMouseDown Да Нет
    PreviewMouseLeftButtonDown Да Нет
    PreviewMouseLeftButtonUp Да Нет
    PreviewMouseMove Да Нет
    PreviewMouseRightButtonDown Да Нет
    PreviewMouseRightButtonUp Да Нет

    Доступ к локальным файлам. WPF имеет практически неограниченный доступ к локальным ресурсам. В то время как Silverlight имеет множество ограничений и использует OpenFileDialog элемент управления браузера. Соответственно браузер может и не разрешить это делать. Записывать данные ( SaveFileDialog ) Silverlight может только в изолированное хранилище на диске. В будущем это будет исправлено.

    Шрифты. WPF использует набор шрифтов операционной системы клиента. Silverlight поддерживает стандартный ограниченный набор и, в случае необходимости, подгружает их или содержит в файле *.ttf архива *.xap. Во 2-й версии Silverlight были доступны шрифты: Arial, Arial Black, Comic Sans MS, Courier New, Georgia, Lucinda Grande / Lucida Sans Unicode, Times New Roman, Trebuchet MS, Verdana. В третьей версии их около 230.

    <TextBlock 
    FontFamily="customfont.ttf#Custom Font">
      Text
    </TextBlock>

    Набор элементов управления. WPF и Silverlight часто используют разные элементы управления. В Silverlight 3 доступно 79 элементов.

    Различия WPF и Silverlight. Элементы управления
    Элемент управления WPF Silverlight
    AccessText Да Нет
    AdornedElementPlaceholder Да Нет
    AdornerDecorator Да Нет
    AutoCompleteBox Нет Toolkit
    Border Да Да
    BulletChrome Да Нет
    BulletDecorator Да Нет
    Button Да Да
    ButtonChrome Да Нет
    Calendar Да SDK
    Canvas Да Да
    CheckBox Да Да
    ClassicBorderDecorator Да Нет
    ComboBox Да Да
    ComboBoxItem Да Да
    ContentControl Да Да
    ContentPresenter Да Да
    ContextMenu Да Нет
    Control Да SDK
    DataGrid Да SDK
    DatePicker Да SDK
    Decorator Да Нет
    DockPanel Да Toolkit
    DocumentPageView Да Нет
    DocumentReference Да Нет
    DocumentViewer Да Нет
    Ellipse Да SDK
    Expander Да Toolkit
    FixedPage Да Нет
    FlowDocumentPageViewer Да Нет
    FlowDocumentReader Да Нет
    FlowDocumentScrollViewer Да Нет
    Frame Да Нет
    FrameworkElement Да Нет
    Glyphs Да Нет
    Grid Да Да
    GridSplitter Да SDK
    GridViewColumnHeader Да Нет
    GridViewHeaderRowPresenter Да Нет
    GridViewRowPresenter Да Нет
    GroupBox Да Нет
    GroupItem Да Нет
    HeaderedContentControl Да Toolkit
    HeaderedItemsControl Да Toolkit
    HyperlinkButton Нет Да
    Image Да Да
    ImplicitStyleManager Да Toolkit
    InkCanvas Да Нет
    InkPresenter Да Да
    ItemsControl Да Да
    ItemsPresenter Да Да
    Label Да Toolkit
    Line Да Да
    ListBox Да Да
    ListBoxChrome Да Нет
    ListBoxItem Да Нет
    ListView Да Нет
    ListViewItem Да Нет
    MediaElement Да Да
    Menu Да Нет
    MenuItem Да Нет
    MultiScaleImage Нет Да
    NavagationWindow Да Нет
    NumericUpDown Нет Toolkit
    Page Да Нет
    PageContent Да Нет
    PageFunction Да Нет
    PasswordBox Да Да
    Path Да Да
    Polygon Да Да
    Polyline Да Да
    Popup Да Да
    ProgressBar Да Да
    RadioButton Да Да
    Rectangle Да Да
    RepeatButton Да Да
    ResizeGrip Да Нет
    Ribbon Да Нет
    RibbonWindow Да Нет
    RichTextBox Да Нет
    ScrollBar Да Да
    ScrollChrome Да Нет
    ScrollContentPresenter Да Да
    ScrollViewer Да Да
    Separator Да Нет
    Slider Да Да
    StackPanel Да Да
    StatusBar Да Нет
    StatusBarItem Да Нет
    SystemDropShadowChrome Да Нет
    TabControl Да SDK
    TabItem Да SDK
    TabPanel Да Нет
    TextBlock Да Да
    TextBox Да Да
    Thumb Да Да
    TickBar Да Нет
    ToggleButton Да Да
    ToolBar Да Нет
    ToolBarOverflowPanel Да Нет
    ToolBarPanel Да Нет
    ToolBarTray Да Нет
    ToolTip Да Да
    Track Да Нет
    TreeView Да Toolkit
    TreeViewItem Да Toolkit
    UniformGrid Да Нет
    UserControl Да Да
    ViewBox Да Toolkit
    Viewport3D Да Нет
    VirtualizingStackPanel Да Нет
    WebBrowser Да Нет
    Window Да Нет
    WindowsFormsHost Да Нет
    WrapPanel Да Toolkit

    Farmework. Silverlight framework и .NET framework, используемый WPF имеют ряд отличий.

    Различия WPF и Silverlight. Коллекции
    Класс WPF Silverlight
    System.Collection
    ArrayList Да Нет
    BitArray Да Да
    HashTable Да Нет
    Queue Да Нет
    SortedList Да Нет
    Stack Да Нет
    System.Collection.Generic
    Dictionary<TKey, TValue> Да Да
    KeyedByTypeCollection<TItem> Да Да
    HashSet<T> Да Нет
    LinkedList<T> Да Да
    List<T> Да Да
    Queue<T> Да Да
    SortedDictionary<TKey, TValue> Да Нет
    SortedList<T> Да Нет
    Stack<T> Да Да
    SynchronizedCollection<T> Да Нет

    Различаются также сетевые, шифровальные возможности, возможности создания потоков, блокировок, 3D графики, стилей, тем, валидаторов.

    Уникальные возможности

    Есть вещи, которые поддерживает только одна из технологий.

    WPF.

    В WPF в отличие от Silverlight имеются функции печати, синтезатора речи, распознавания речи и др., поддержка тем и скинов (skins), "горячие клавиши".

    Silverlight. (подробнее см. раздел )

  • Приложению Silverlight не обязательно перегружать целую страницу для изменения одной ее части. Silverlight может вызывать методы JavaScript и наоборот и взаимодействовать с HTML document object model (DOM).

    Вызов методов JavaScript из кода

    using System.Windows.Browser;
    // call a method 
    HtmlPage.Window.Eval("customMethod();"); 
    // use invoke syntax 
    HtmlPage.Window.Invoke("customMethod"); 
    // use invoke syntax with parameters 
    HtmlPage.Window.Invoke("customMethod", "param1", 12); 
    // use invoke syntax and get return value. 
    string name = (string) HtmlPage.Window.Invoke("getName");

    Вызов методов кода из JavaScript (в коде необходимо указать атрибуты [ScriptableType] перед классом и [ScriptableMember] перед методом)

    <script type="text/JavaScript"> 
    function onPluginLoaded() 
    { 
      var sl = $get("Xaml1"); // Use ID associated with plugin. 
      var sm = sl.content.SilverlightMethods;
      var name = sm.GetUserName(); // Case sensitive. 
    } 
    </script>
  • Поддержка высококачественного видео и звука на базе технологии Smooth Streaming: качество картинки меняется автоматически в режиме реального времени в зависимости от скорости передачи данных и мощности компьютера пользователя (подробно в разделе ).
  • Работа с фотографиями на базе технологии Deep Zoom: технология усиленного масштабирования Deep Zoom предлагает новый стандарт просмотра и создания изображений со сверхвысоким разрешением, обеспечивая плавное и точное масштабирование и панаромирование (подробно в разделе )
  • Триггеры

    WPF и Silverlight 3 поддерживают триггеры. Кроме триггеров Silverlight поддерживает Visual State Manager. В будущих реализациях в WPF также будет класс Visual State Manager, увеличивая сходство обеих технологий.

    В настоящее время Silverlight XAML поддерживает только один тип триггеров - EventTrigger. Каждое свойство пользовательского интерфейса имеет коллекцию Triggers, которая используется для определения одного или более триггеров (т.е. одного или более объектов EventTrigger ). Итак, первый шаг в добавлении триггера в элемент управления - создание его коллекции триггеров. Затем в эту коллекцию необходимо будет добавить, по крайней мере, один триггер события. Например, если необходимо при загрузке страницы добавить анимацию, то это выглядит следующим образом:

    <Rectangle x:Name="MyAnimatedRectangle"
               Width="100"
               Height="100"
               Fill="Blue">
      <Rectangle.Triggers>
        <EventTrigger RoutedEvent="Rectangle.Loaded">
          <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation Storyboard.TargetName="MyAnimatedRectangle"
                     Storyboard.TargetProperty="Opacity"
                     From="1.0" 
                     To="0.0" 
                     Duration="0:0:5" 
                     AutoReverse="True" 
                     RepeatBehavior="Forever" />
            </Storyboard>
          </BeginStoryboard>
        </EventTrigger>
      </Rectangle.Triggers>
    </Rectangle>

    Данный код выводит квадрат синего цвета, затем за 5 секунд квадрат становится прозрачным. Код полностью одинаков как для приложения Silverlight, так и для WPF.

    (рис 4.16 ) Триггеры в Silverlight(рис 4.17 ) Триггеры в WPF

    Стратегия повторного использования кода

    Совместное использование кода WPF и Silverlight кажется невозможной задачей, учитывая многочисленные отличия. Но при аккуратном планировании разработчик все таки может значительную часть кода использовать одновременно в обеих технологиях. Silverlight становится ближе к WPF с каждым следующим релизом. Ниже приведены некоторые техники для сближения кода.

    Пользовательские элементы управления. Это один из способов совместного использования кода. Элементы управления построенные полностью на коде C# будут полностью совместимы. XAML код также можно сделать максимально похожим.

    Классы Partial. С помощью таких классов можно организовать целый класс, определение которого хранится в нескольких файлах. Можно класс организовывать из трех файлов. В одном содержится общий код для обеих платформ, во втором уникальный код для Silverlight, в третьем уникальный код для WPF. Таким образом, проект Silverlight будет содержать 1-й и 2-й файлы, а проект WPF 1-й и 3-й.

    Директивы компилятору. Использование условных директив компилятору позволит иметь в сборке только нужные фрагменты кода:

    #if SILVERLIGHT 
      <код для Silverlight > 
    #else 
      < код для > 
    #endif

    Ссылки на файлы. Можно файл *.cs одного проекта использовать в другом, подключив его как ссылку.

    Выводы

    WPF и Silverlight создают новую парадигму в разработке приложений, используя одну и туже базовую технологию декларативного программирования и модель code-behind для процедурного программирования. Silverlight считается подразделом WPF и постоянно приближается к нему с каждым следующим релизом. Несмотря на это Silverlight остается плагином к браузеру, что накладывает особый подход к программированию и архитектуре.

    Вернуться к учебному плану