Новые возможности 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
API буфера обмена
В Silverlight 4 был добавлен простой API для работы с буфером обмена. Он работает на всех платформах, поддерживаемых Silverlight.
Пример кода:
Clipboard.SetText("Некоторый текст в буфере обмена");
Этот код показывает возможность записи некоторого текста в буфер обмена операционной системы из приложения Silverlight.
Метод GetText() возвращает текст, содержащийся в буфере, а ContainsText() определяет, хранится ли в настоящий момент в буфере текст.
Отображение HTML-документа с помощью элемента WebBrowser
В Silverlight 4 стало возможным отображение HTML-документов в интерфейсе приложения. Для этого используется элемент WebBrowser, HTML-код в который можно загружать как из строковой переменной, так и из удаленной странице по URL.
<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; }