Pull to refresh

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

Reading time11 min
Views2.9K
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
Tags:
Hubs:
Total votes 52: ↑34 and ↓18+16
Comments21

Articles