Технологии Microsoft для создания RIA-приложений

Новые возможности Silverlight 4

Показывать лекцию целиком

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

Одной из нововведений Silverlight 4 - поддержка печати на стороне клиента. В Silverlight 4 появился такой API System.Windows.Printing.PrintDocument.

Пример кода демонстрирующий печать:

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;
     };
 
   // зaпуск печати
   docToPrint.Print();
}

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

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

Теперь, в дополнение к событиям 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 реализован доступ к веб-камере или к микрофону.

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

Пример кода для запроса разрешения:

Пример кода для захвата изображения:

// запрос разрешения у пользователя и показ изображения
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 для обработки событий колеса мыши нужно было использовать какие-либо вспомогательные классы, например от DeepZoom. В четвертой версии был добавлен соответствующий API.

Пример кода:

// привязка события
myRectangle.MouseWheel += new MouseWheelEventHandler(RectangleZoom);
 
void RectangleZoom(object sender, MouseWheelEventArgs e)
{
}

Элемент RichTextArea

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

(рис 21.1) Пример использования RichTextArea

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

В Silverlight 4 был добавлен простой API для работы с буфером обмена. Он работает на всех платформах, поддерживаемых Silverlight.

Пример кода:

Clipboard.SetText("Некоторый текст в буфере обмена");

Этот код показывает возможность записи некоторого текста в буфер обмена операционной системы из приложения Silverlight.

Метод GetText() возвращает текст, содержащийся в буфере, а ContainsText() определяет, хранится ли в настоящий момент в буфере текст.

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

В 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>");

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

Для чтения/записи данных с компьютера пользователя обычно используются механизмы OpenFileDialog (для чтения) и SaveFileDialog (для записи). В Silverlight 4 появился прямой доступ к локальным файлам пользователя ( "Мои документы", "Мое видео", "Моя музыка" и т.д).

Чтобы получить путь к файлам, нужно использовать пространство имен 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; // получение активного листа

Требуются расширенные права (доверенное приложение).

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);
}

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

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

В 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" />

Дополнительные возможности

Новые возможности

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