Подробный обзор нововведений Silverlight 4

    silverlight 4Эта статья содержит более подробное описание нововведений Silverlight 4, таких как:
    • Печать из приложений
    • Обработка нажатий правой кнопки мыши и движений колеса
    • Работа с веб-камерой и микрофоном
    • Работа с буфером обмена
    • Особености trusted-приложений
    • Взаимодействие с объектами COM
    • и многое другое…
    Для большинства приведены примеры кода и изображения.


    Инструменты разработки


    В Visual Studio 2010 появился полный визуальный конструктор интерфейсов Silverlight. Теперь вы сможете редактировать интерфейс для приложений на Silverlight версий 3 и 4. Реализована поддержка привязки данных.
    silverlight 4
    Кроме того, в VS2010 для WCF RIA Services появился продвинутый редактор с поддержкой класса DomainSource в качестве Data Source.
    А благодаря «multi-targeting», в VS2010 можно одновременно разрабатывать приложения на Silverlight версий 3 и 4.
    Видео: Поддержка RIA Services в Visual Studio 2010

    Печать из Silverlight (Printing API)


    Одной из наиболее запрашиваемых нововведений была поддержка печати на стороне клиента. В Silverlight 4 появился такой API.
    Пример кода:
    private void PrintAll_Click(object sender, RoutedEventArgs e)
    {
       // инициализация нового PrintDocument
       PrintDocument docToPrint = new PrintDocument();
      
       // установка названия для отображения в очереди печати
       docToPrint.DocumentName = "Entire Screen Sample";
     
       // подготовка к печати
       docToPrint.StartPrint += (s, args) =>
         {
           ActivityDisplay.IsActive = true;
         };
     
       // установка объекта для печати
       docToPrint.PrintPage += (s, args) =>
         {
           args.PageVisual = this.StackOfStuff;
         };
     
       // завершение подготовки к печати
       docToPrint.EndPrint += (s, args) =>
         {
           ActivityDisplay.IsActive = false;
         };
     
       // зупуск печати
       docToPrint.Print();
    }

    Как видно выше, есть возможность добавления пре- и пост- кода для подготовки к печати. PrintPage это поле, в которое разработчик может установить элемент интерфейса, который необходимо напечатать. Это может быть уже существующий элемент визуального дерева или что-то созданное в виртуальной памяти.
    Видео и примеры кода: Printing API

    Обработка нажатия правой кнопки мыши


    В приложении необходимо сделать контекстное меню? Теперь, в дополнение к событиям MouseLeftButtonUp/Dow, появились события MouseRightButtonUp/Down. Это позволяет разработчку настроить выполнение любого кода при нажатии кнопок мыши, будь это команда управления в игре или открытие контекстного меню.
    Пример кода:
    public partial class MainPage : UserControl
    {
       public MainPage()
       {
         InitializeComponent();
     
         // добавление выполнения функций при нажатии правой кнопки мыши
         ChangingRectangle.MouseRightButtonDown += new MouseButtonEventHandler(RectangleContextDown);
         ChangingRectangle.MouseRightButtonUp += new MouseButtonEventHandler(RectangleContextUp);
       }
     
       void RectangleContextUp(object sender, MouseButtonEventArgs e)
       {
         // создание контекстного меню и его показ
         ColorChangeContextMenu contextMenu = new ColorChangeContextMenu(ChangingRectangle);
         contextMenu.Show(e.GetPosition(LayoutRoot));
       }
     
       void RectangleContextDown(object sender, MouseButtonEventArgs e)
       {
         // по-умолчанию комнекстное меню должно быть скрыто
         e.Handled = true;
       }
    }

    Этот исходный код представляет собой заготовку для добавления контекстного меню в приложение на Silverlight 4. Результат будет выглядить так:
    silverlight 4
    Видео и примеры кода: Обработка нажатия правой кнопки мыши

    Доступ к веб-камере и микрофону


    Нужен доступ к веб-камере и/или к микрофону? В Silverlight 4 это можно сделать. С помощью нескольких строк кода разработчик может запросить у пользователя разрешение на доступ к его устройству видео- или аудио- захвата.
    Пример кода для запроса разрешения:
    // запрос разрешения у пользователя и показ изображения
    if (CaptureDeviceConfiguration.AllowedDeviceAccess || CaptureDeviceConfiguration.RequestDeviceAccess())
    {
       _captureSource.Start();
    }

    Пример кода для захвата изображения:
    if (_captureSource != null)
    {
       _captureSource.Stop(); // остановка устройства захвата
     
       // установка устройств захвата
       _captureSource.VideoCaptureDevice = (VideoCaptureDevice)VideoSources.SelectedItem;
       _captureSource.AudioCaptureDevice = (AudioCaptureDevice)AudioSources.SelectedItem;
     
       // создание кисти
       VideoBrush vidBrush = new VideoBrush();
       vidBrush.SetSource(_captureSource);
       WebcamCapture.Fill = vidBrush; // закраска области этой кистью =)
     
       // запрос разрешения у пользователя и показ изображения
       if (CaptureDeviceConfiguration.AllowedDeviceAccess || CaptureDeviceConfiguration.RequestDeviceAccess())
       {
         _captureSource.Start();
       }
    }

    Также добавлен простой API для фотографирования с помощью веб-камеры:
    private void TakeSnapshot_Click(object sender, RoutedEventArgs e)
    {
       if (_captureSource != null)
       {
         // захват текучего кадра и добавление его в коллекцию
         _captureSource.AsyncCaptureImage((snapImage) =>
           {
             _images.Add(snapImage);
           });
       }
    }

    Более подробно об этом на русском языке можно прочитать в статье на Хабре «Работа с веб камерой и микрофоном в Silverlight 4» Сергея Пугачева WizardBox.
    Видео и примеры кода: Поддержка веб-камеры и микрофона

    Поддержка колеса мыши


    В предыдущих верисиях Silverlight для обработки событий колеса мыши нужно было использовать какие-либо вспомогательные классы, например от DeepZoom. В четвертой версии был добавлен соответствующий API.
    Пример кода:
    // привязка события
    myRectangle.MouseWheel += new MouseWheelEventHandler(RectangleZoom);
     
    void RectangleZoom(object sender, MouseWheelEventArgs e)
    {
       // какой-либо код
    }

    Как видно, можно легко привязать обработку события колеса мыши для конкретного элемента.
    Видео и примеры кода: Обработка событий колеса мыши

    Элемент RichTextArea


    Одним из запрашиваемых пользователями нововведением был элемент интерфейса с редактируемым богатым текстом (поддержка жирного, курсива, разных размеров, цветов и т.д.). Используя RichTextArea, теперь можно получить такой элемент.
    Вот как может выглядеть RichTextArea:
    silverlight 4
    Видео и примеры кода: Элемент RichTextArea

    API буфера обмена


    В Silverlight 4 был добавлен простой API для работы с буфером обмена. Он работает на всех платформах, поддерживаемых Silverlight.
    Пример кода:
    Clipboard.SetText("Некоторый текст в буфере обмена");

    Этот код показывает возможность записи некоторого текста в буфер обмена операционной системы из приложения Silverlight.
    Метод GetText() возвращает текст, содержащийся в буфере, а ContainsText() определяет, хранится ли в настоящий момент в буфере текст.
    Видео и примеры кода: Доступ к буферу обмена
    Clipboard.SetText("Некоторый текст в буфере обмена");


    Отображение HTML-документа с помощью элемента WebBrowser


    Когда мы работаем в вебе, почти всегда приходится иметь дело с документами HTML. В Silverlight 4 стало возможным отображение HTML-документов в интерфейсе приложения. Для этого используется элемент WebBrowser, HTML-код в который можно загружать как из строковой переменной, так и из удаленной странице по URL.
    Пример кода (XAML):
    <WebBrowser x:Name="MyBrowserControl" Width="800" Height="600" />

    Пример кода (C#):
    MyBrowserControl.NavigateToString("<div style='color:red;width:100;height:100'><b>Example HTML</b></div>");

    Вот изображение примера, где приложение Silverlight отображает HTML-документ с плеером YouTube на Flash:
    silverlight 4
    Кроме того, можно использовать кисть HtmlBrush, чтобы заполнять произвольные элементы интерфейса.
    Видео и примеры кода: Отображение HTML-документов в Silverlight

    Доверенные приложения


    Иногда для работы внебраузерного приложения Silverlight требуются повышенные права. В четвертой версии появилась возможность запросить повышенние прав. Это можно сделать в свойствах приложения в VS:
    silverlight 4
    В результате этого при установки внебраузерного приложения появится предупреждение:
    silverlight 4
    Следующие нововведения показывают возможность доверенных приложений.

    Доступ к локальным файлам на клиентском компьютере


    Для чтения/записи данных с компьютера пользователя обычно используются механизмы типа OpenFileDialog (для чтения) и SaveFileDialog (для записи). В Silverlight 4 появился прямой доступ к локальным файлам пользователя в «Моих»-папках. Это «Мои документы», «Мое видео», «Моя музыка» и т.д. В MacOS X это директории типа «/users/username/Videos».
    Чтобы получить путь к файлам, нужно использовать пространство имен Environment.
    Пример кода:
    private void EnumerateFiles(object sender, RoutedEventArgs e)
    {
       // создание списка для имен файлов
       List<string> videosInFolder = new List<string>();
     
       // используя Directory API,
       // используя SpecialFolder API, получаем путь к папке "Мое видео"
       var videos = Directory.EnumerateFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyVideos));
      
       // перечисляем файлы
       foreach (var item in videos)
       {
         videosInFolder.Add(item);
       }
     
       // привязываем данные
       VideoFileListing.ItemsSource = videosInFolder;
    }

    Требуются расширенные права (доверенное приложение).
    Видео и примеры кода: Доступ к локальным файлам

    COM взаимодействие


    В приложении нужно сделать взаимодействие с переферийным устройством, которое предоставляет только COM-интерфейс? Или нужно работать с приложениями Office? Используя ComAutomationFactory API в приложении Silverlight 4, можно создавать и взаимодействовать с COM-объектами.
    Пример кода (взаимодействие с Excel):
    // создание экземпляра Excel
    dynamic excel = ComAutomationFactory.CreateObject("Excel.Application");
     
    excel.Visible = true// включение его видимости для пользователя
     
    // добавление книги
    dynamic workbook = excel.workbooks;
    workbook.Add();
     
    dynamic sheet = excel.ActiveSheet; // получение активного листа

    Требуются расширенные права (доверенное приложение).
    Видео и примеры кода: Доступ к COM объектам в доверенных приложениях

    API всплывающих уведомлений (Notification API)
    Нужен удобный механизм уведомлений пользователей? В Silverlight 4 появилась возможность показа всплывающих уведомлений рядом с треем.
    Используя NotificationWindow в Silverlight, вы получите простой или настраиваемый механизм уведомлений для вашего приложения.
    Пример кода:
    private void CustomNotificationButton_Click(object sender, RoutedEventArgs e)
    {
       // создание окна уведомления
       NotificationWindow notify = new NotificationWindow();
       notify.Height = 74;
       notify.Width = 329;
     
       // создание содержимого этого окна
       CustomNotification custom = new CustomNotification();
       custom.Header = "Sample Header";
       custom.Text = "Hey this is a better looking notification!";
       custom.Width = notify.Width;
       custom.Height = notify.Height;
     
       // установка этого содержимого
       notify.Content = custom;
     
       // показ уведомления
       notify.Show(4000);
    }

    Вот как может выглядеть элемент NotificationWindow:
    silverlight 4
    Уведомления могут быть использованы только в приложениях вне браузера.
    Более подробно об этом на русском языке можно почитать в статье на Хабре «Silverlight 4: NotificationWindow» jeje.
    Видео и примеры кода: Notification Window API

    Аутентификация в веб-запросах


    В Silverlight 4 есть возможность передавать NetworkCredential информацию, используя стек ClientHttp, который был представлен в Silverlight 3. Например, чтобы передать логин/пароль сервису, можно сделать так:
    // NetworkCredential passing is available in ClientHttp networking stack
    WebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp);
     
    WebClient myService = new WebClient();
    myService.Credentials = new NetworkCredential("someusername", "somepassword");
    myService.UseDefaultCredentials = false; // Иначе будут использованы значения по-умолчанию
    myService.DownloadStringCompleted += new DownloadStringCompletedEventHandler(OnResultCompleted);
    myService.DownloadStringAsync(new Uri(http://somewebsite.com/authenticatedservice));

    Видео и примеры кода: Аутентификация в веб-запросах

    Изменения в кросс-доменной работе


    Если ваше Silverlight 4 приложение работает в режиме повышенных привелегий (доверенное приложение), то для работы с веб-сервисами из другого домена вам больше не требуется использовать файлы «clientaccesspolicy.xml» или «crossdomain.xml».
    Видео и примеры кода: Кросс-доменные запросы в доверенных приложениях

    Полный доступ к клавиатуре в режим full-screen


    Если ваше приложение Silverlight работает в полном экране (IsFullScreen=”true”), вам был доступен лишь ограниченный ввод с клавиатуры. В доверенных приложениях на Silverlight 4 в режиме полного экрана полностью поддерживается ввод с клавиатуры для элементов типа TextBox и др.
    Требуются расширенные права (доверенное приложение).

    Обрезание текста


    Элемент TextBlock имеет новое свойство, называемое TextTrimming, которое позволяет может быть установлено в значение WordElipse. Когда это сделано, любой текст, непомещающийся в ширину элемента, будет обрезан, а вместо его непоказанной части будет многоточие.
    Пример кода:
    <TextBlock HorizontalAlignment="Left" VerticalAlignment="Top"
       Text="The quick brown fox jumped over the tall white fence" 
       TextTrimming="WordEllipsis" Width="120" />

    Выглядеть это будет так:
    silverlight 4

    Поддержка написания справа-налево


    Если в вашем приложении необходима поддержка написания справа-налево (RTL), вы можете использовать новый аттрибут элементов – FlowDirection.
    Пример кода:
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="ControlSamples">
       <TextBlock FlowDirection="LeftToRight" Foreground="White" Text="BiDi and RTL Sample" FontSize="20" Margin="20" />
       <RichTextArea TextWrapping="Wrap" Width="600" Height="150"></RichTextArea>
       <TextBlock FontSize="24" Foreground="White" Text="قفز الثعلب البني السريع فوق الكلب الكسول." />
       <ListBox>
         <ListBox.Items>
           <ListBoxItem Content="قفز الثعلب البني السريع فوق الكلب الكسول." />
           <ListBoxItem Content="Option 1" />
           <ListBoxItem Content="Option 2" />
           <ListBoxItem Content="Option 3" />
           <ListBoxItem Content="Option 4" />
         </ListBox.Items>
       </ListBox>
    </StackPanel>

    Это наследуемое свойство.
    Видео и примеры кода: Поддержка двунаправленного текста и написания справа-налево

    Использования приложения Silverlight в качестве контейнера для drag-n-drop


    Иногда удобно просто перетащить файл на окно приложения, чтобы загрузить его. Вы сможете использовать этот сценарий, установив атрибут AllowDrop для какого-либо элемента интерфеса.
    Пример кода:
    public MainPage()
    {
       InitializeComponent();
       Loaded += new RoutedEventHandler(MainPage_Loaded);
      
       // установка обработки событий перетаскиания
       InstallButton.Drop += new DragEventHandler(InstallButton_Drop);
       InstallButton.DragOver += new DragEventHandler(InstallButton_DragOver);
       InstallButton.DragEnter += new DragEventHandler(InstallButton_DragEnter);
       InstallButton.DragLeave += new DragEventHandler(InstallButton_DragLeave);
    }
     
     
    void InstallButton_Drop(object sender, DragEventArgs e)
    {
       IDataObject foo = e.Data; // обработка данных
    }

    Это очень удобно использовать, например при загрузки файлов на сервер.
    Видео и примеры кода: Использования Silverlight в качестве контейнера для drag-n-drop

    Ссылки на другие материалы и ресурсы по Silverlight 4 можно найти в статье на Хабре «Silverlight 4 Beta уже доступна. Что внутри?» Михаила Черномордикова mixen.
    Запись в моем блоге: Oбзор нововведений Silverlight 4
    Метки:
    Поделиться публикацией
    Комментарии 21
    • +9
      С днём Рождения!
    • +1
      ушел пробовать) вебкамеру вчера пробовал… понравилось:)
      • 0
        Забыли ссылку на оригинал.
        • НЛО прилетело и опубликовало эту надпись здесь
          • +3
            паскаль или делфи тоже? поскольку архитектор дельфи и C# — это один человек, то у них много схожего (ну не очень много, но есть заметное сходство например sender в обработчиках событий).

            так вот если навык дельфи есть то можно смело учить C# и брать книжку по SL введение в который даже есть в бесплатном виде, заботливо переведено российским Microsoft на русский.

            если знания — только паскаль, то надо отбросить и учить с нуля, взять книгу по C# по-проще и учить язык. Потом подтянуть и SL. Сразу начинать с SL я бы не советовал.
            • НЛО прилетело и опубликовало эту надпись здесь
              • +1
                библия C# — это «CLR via C#» от Джеффри Рихтера. Это наше все.

                но для начала можно взять любую книгу от Дино Эспозито, Петцольда или Троелсена названий не помню.
                вообще, лучше зайти в ближайший магазин, перебрать все книги по .net (тысячи их) и выбрать ту которая написана в твоем духе
                • +2
                  Лучше с Троелсена начинать, Эспозито и Петцольд довольно «специализарованные». Можно ещё, конечно, Шилдта почитать, но не уверен есть ли его книга для 2.0.
                  • +2
                    Шилдта посоветую только как справочник, совершенно сухая книга. Да и не слышал я о переиздании, может не актуальная уже.
                • +1
                  «С# 2005 и платформа .NET 3.0 для профессионалов. Кристиан Найгел, Билл Ивьен.»
                  Даст хорошее представление о C#
                  Книга может и не самая последняя, но в ней есть все что нужно, хоть и не в большом объеме, даже C# 3.0. А дальше я думаю можешь взять любую книгу по SilverLight и обращаться когда нужно к msdn и к тому, что я посоветовал.
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • +1
                      Немного оффтоп про много книг:

                      Я тоже прочитал много книг по HTML CSS и много много других.
                      Советы:
                      Толщина не всегда есть хорошо.
                      Словосочетание «освой за N часов» сразу должно настораживать.
                      Язык оригинала должен быть в приоритете.

                      Поэтому, в идеале, читать надо официальную документацию. Если не понятно, книги на англ. языке, так не будет проблем с переводом специальных терминов и желательно брать книги известных издательств ( например O'Reilly). Ну а если и с языком не очень, тогда набрать несколько книг разных российских издательств разной толщины :)
            • +1
              Отлично. Спасибо за статью. Помню как я программировал на флеш и меня больше всего раздражало: невозможность отключение «about flash», аналог того что в видео отключили «silverlight»
              www.silverlight.net/learn/videos/silverlight-4-beta-videos/right-click-mouse-events/

              И невозможность записи в буфер обмена, однако это можно было сделать через JS.
              Ну и фишка с обрезанием теста, помню как сам с этим парился и высчитывал ширину каждой буквы.
              Спасибо за обзор.
              • +1
                Очень долго ждал поддержки работы с буфером обмена.
                Кое-где в блогах разработчиков даже писал.

                Через JS было крайне ущербно или с использованием флеша =/
              • +1
                Ого аж глаза разбигаются. Сколько нового. Честно, когда голосовал за возможность печати, веб-камеру и микрофон думал что это будет реализовано не скоро. А тут еще столько всего нового, хватило бы и на Silverlight 5 ;-) Большое спасибо. Пора задуматься что пожелать дальше.
                • +1
                  RIA рулят! Прям руки чешутся попробовать. Жаль работы много.
                  • +1
                    А как насчет перехода в полно-экранный режим?
                    не браузерный F11, а собственный. Есть такое?
                  • +1
                    М, сколько сразу полезностей. Спасибо за обзор.

                    На самом деле, вот лично мне сильно не хватает возможности сгеренить из сильверлайта .exe, к которому прилинковался бы «сильверлайт плеер», что бы оно запускалось на любой машине. Так как это можно сделать с флешем.

                    Но наверное если такое и будет, то не скоро. Т.к. в любом случае зависимости от дотнета и 10-го медиаплеера испортят малину… ых.

                    Хотели, вот, на заказ сделать медиа-презентации на базе сильверлайт. Из-за этих ограничений пришлось отказаться от идеи, не смотря на кучу наработок в наличии :|
                    • 0
                      картинки не показываются :(

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.