Блог Сергея Байдачного

Мой блог о технологиях

Posts Tagged ‘SilverLight 4

SharePoint 2010 и SilverLight: Использование Visual Studio 2010

6 комментариев

Попробуем использовать Visual Studio 2010 для создания решения для SharePoint, включающего в себя web-часть, содержащую Silverlight-приложение.

Поскольку создание веб-части дело тривиальное, будем использовать шаблон решения, предназначенного для развертывания в «песочнице» SharePoint 2010. Для этого необходимо создать проект на основе шаблона Empty SharePoint Project и выбрать адрес сайта, где Вы планируете провести тестирование веб-части и опцию Deploy as a sandbox solution.

image

@3 Создание проекта для SharePoint 2010

В созданное решение добавьте еще один проект на основе шаблона Silverlight Application (у меня проект называется SharePointMediaWebPart). При этом, снимите галочку Host the Silverlight application in a new Web Site (он нам не понадобится):

image

@4 Создание Silverlight-приложения

На последнем шаге, при подготовке каркаса нашего решения, добавим к SharePoint проекту новый элемент. Для создания нового элемента выберем шаблон Web Part (не Visual). В результате структура Вашего проекта будет напоминать ту, которая отображена на рисунке ниже:

image

@5 Структура проекта

Прежде чем приступить к написанию кода и развертыванию решения, необходимо проверить наличие возможности развернуть Ваш код в «песочницу» SharePoint. Как ни странно, при инсталляции бета-версии SharePoint 2010, эта возможность по умолчанию выключена.

Итак, если при развертывании решения Вы получаете ошибку Error occurred in deployment stepRetract Solution‘: Cannot start service SPUserCodeV4 on computer ‘…..’, вероятнее всего у Вас не запущена служба Windows SharePoint Services User Code Host V4. Измените способ запуска этой службы на Automatic и запустите ее.

image

Запустив службу, Вы можете попробовать развернуть проект. Вероятнее всего Вы получите следующую ошибку: Error occurred in deployment step ‘Activate Features’: This feature cannot be activated at this time. The contents of the feature’s solution requires the Solution Sandbox service to be running. Чтобы, наконец, развернуть наше решение, необходимо запустить утилиту администрирования SharePoint 2010 и запустить SharePoint Foundation User Code Service службу и там. Хотя последнее действие скорее активирует возможность, чем запускает службу, Вам необходимо перейти в раздел System Settings->Manage Services on Server и нажать Start.

image

@7 Активация службы с помощью утилиты администрирования

Запустив все необходимые службы, можно приступить к написанию кода.

Первым делом реализуем Silverlight-приложение, заполнив его содержимое простым MediaElement (мы не будем создавать сложный интерфейс).

<UserControl x:Class="SharePointMediaWebPart.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid x:Name="LayoutRoot" Background="White" HorizontalAlignment="Left">
        <MediaElement Name="myMedia" AutoPlay="True"></MediaElement>
    </Grid>
</UserControl>

Выбирать имя отображаемого видео будем, используя конфигурационный параметр элемента object, добавляющего встраиваемый компонент Silverlight на страницу. Поэтому, реализуем код, выбирающий параметр с ключом media:

private void Application_Startup(object sender, StartupEventArgs e)
{
    this.RootVisual = new MainPage();
 
    ((MainPage)this.RootVisual).myMedia.Source =
         new Uri(
             this.Host.InitParams["media"], 
             UriKind.RelativeOrAbsolute);
}

Silverlight-приложение полностью готово. Перейдем к разработке созданной веб-части.

Код нашей веб-части достаточно простой: он просто генерирует элемент object, который вписывает в содержимое:

protected override void RenderContents(HtmlTextWriter writer)
{ 
    string html = String.Format(
        "<object data=\"data:application/x-silverlight-2,\" "+
        "type=\"application/x-silverlight-2\" width=\"90%\" height=\"90%\">" +
        "<param name=\"source\" value=\"_catalogs/masterpage/SharePointMediaWebPart.xap\"/>" +
        "<param name=\"minRuntimeVersion\" value=\"4.0.41108.0\" />" +
        "<param name=\"initparams\" value=\"media={0}\" />" +
        "</object>", 
        this.MediaSource);
 
    writer.Write(html);
 
    base.RenderContents(writer);
}

Кроме этого, необходимо определить свойство MediaSource, которое будет задаваться редактором сайта:

private string _mediaSource = "";
 
[WebBrowsable(true),
WebDescription("Select .wmv file from a list"),
WebDisplayName("Media Source"),
Personalizable(PersonalizationScope.User)]
public string MediaSource
{
    get
    {
        return _mediaSource;
    }
    set
    {
        _mediaSource = value;
    }
}

Собственно говоря, это весь код. Остается настроить проект таким образом, чтобы он включал .xap-файл приложения и выполнял его развертывание в один из существующих списков (я выбрал список с эталонными страницами).

Чтобы включить .xap-файл в решение SharePoint 2010, войдите в свойства веб-части (MediaWebPart), и установите ссылку на выходной файл нашего SilverLight-проекта. Для этого используется окно Project Output Reference:

image

@8 Добавление .xap-файла в пакет решения

Имея .xap-файл внутри нашего пакета, остается развернуть его внутри списка с эталонными страницами. Для этого отредактируйте файл elements.xml, добавив внутрь элемента Elements следующий код:

  <Module Name="MediaWebPartXap" Url="_catalogs/masterpage">
    <File Path="MediaWebPart\SharePointMediaWebPart.xap" 
       Url="SharePointMediaWebPart.xap" Type="GhostableInLibrary">
    </File>
  </Module>

Проект готов к развертыванию.

Попробуйте выполнить развертывание и создать произвольный список, куда разместить видео-файл. Добавьте созданную веб-часть на любую из страниц и укажите ссылку на видео-файл в вашем списке, используя свойство Media Source в окне настроек веб-части. Если Вы все сделали верно, то на экране отобразиться видео:

image

Реклама

Written by Sergiy Baydachnyy

09.02.2010 at 17:19

Опубликовано в SharePoint, SilverLight

Tagged with ,

SharePoint 2010 и SilverLight: Встроенные Web-части

leave a comment »

Самый простой способ добавить Silverlight-приложение на страницу, это использовать уже встроенные Web-части. Для этого нужно выполнить два действия:

· Разместить существующий .xap-файл в один из списков SharePoint. Список или библиотека могут быть абсолютно произвольными. Я предпочитаю использовать библиотеки, определенные в шаблоне Global, например, галерею master-страниц. Загрузив .xap-файл в выбранный список, обязательно скопируйте полный путь к нему (например, http://sbaydach64/_catalogs/masterpage/SilverLight/DragAndDrop_Chapter0.xap);

· Перейдите на страницу, где Вы планируете разместить Silverlight-приложение, войдите в режим редактирования и выберите Silverlight Web-часть, указав Url на Ваш .xap-файл:

image

@2 Вставка Silverlight Web-части

Как видно, разместить готовое Silverlight-приложение не представляет трудностей даже для обычного пользователя.

Когда я говорю о SharePoint 2010, то обычно подразумеваю как бесплатную версию продукта – SharePoint Foundation 2010, так и платную – SharePoint Server 2010. Silverlight web-часть присутствует в обоих версиях продукта. А вот Web-часть, отображающая видео, присутствует только в платной версии.

Фактически, Silverlight Media Web-часть представляет собой готовый медиа плейер, позволяющий принимать имя видео файла в одном из списков SharePoint. Эта web-часть может быть использована пользователем, для размещения видео на любой из страниц. Кроме этого, она используется в библиотеках, предназначенных для хранения видео, изображений и другой информации.

Несмотря на то, что Silverlight Media Web-часть отсутствует в бесплатной версии, ее легко реализовать самостоятельно, но для этого Вам понадобиться Visual Studio 2010.

Продолжение следует.

Written by Sergiy Baydachnyy

05.02.2010 at 09:47

Опубликовано в SharePoint, SilverLight

Tagged with ,

SharePoint 2010 и SilverLight: Обзор возможностей

leave a comment »

Вчера мне позвонили партнеры, с вопросом о том, как в существующие проекты на SharePoint 2007 добавить Silverlight-компоненты, отображающие видео. Речь шла о корпоративных сайтах, доступных внутри сети предприятия. После этого звонка, я решил добавить пост, посвященную интеграции Silverlight на сайты, под управлением SharePoint. Речь пойдет о SharePoint 2010. Это связано с тем, что этот продукт будет более востребован в ближайшее время. Кроме того, при разработке SharePoint 2010, на Silverlight был сделан отдельный акцент, в результате чего, можно говорить о тесной интеграции этих двух продуктов.

Еще в своих постах о SilverLight 4, я говорил, что в Silverlight был сделан большой акцент не только на общедоступные приложения, работающие в Интернет, но и на корпоративные приложения. Между тем, SharePoint представляет собой продукт, который призван решить две задачи: реализовать механизм управления контентом на сайтах организации, обеспечить поддержку процессов документооборота. И если на рынке CMS систем, SharePoint 2010 имеет сильных конкурентов, большинство из которых Open Source (с открытым кодом, но никак не свободным – эта игра слов, для новичков), то в корпоративном секторе, среди систем документооборота, ему нет равных. Тут есть и тесная интеграция с Windows Workflow, и ASP.NET ориентированный интерфейс, а теперь еще и интеграция с Silverlight.

Давайте рассмотрим, какие возможности, связанные с Silverlight, представлены в SharePoint.

Тут можно сделать акцент на следующих возможностях:

· Поддержка специальной Web-части (Silverlight Web Part), которая позволяет отобразить Silverlight-приложение;

· Поддержка специального Silverlight элемента управления, который способен отображать видео на SharePoint сайтах;

· Тесная интеграция с Office Web Application – набором офисных пакетов, работающих в Web. Именно в Web, Microsoft теперь выпускает такие продукты, как Word, Excel, PowerPoint, работающие в браузере. С одной стороны, эти продукты можно использовать в Интернет, например, редактируя документы в Sky Drive. С другой стороны, эти продукты поставляются вместе с SharePoint Server 2010 – платной версией SharePoint. Office Web Application могут работать, используя только возможности HTML и JavaScript, но если на машине пользователя установлен Silverlight, то он сможет воспользоваться дополнительными преимуществами интерфейса;

· Поддержка специально разработанных библиотек (Client API), позволяющих взаимодействовать с SharePoint из Silverlight-приложения, скрывая детали от разработчика;

· Взаимодействие с данными из списков SharePoint с помощью REST служб, то есть служб, обмен данными с которыми происходит по HTTP, но с сохранением связей между объектами. Подобный механизм работает благодаря тому, что все списки в SharePoint, имеют точку доступа к соответствующей REST-службе. В свою очередь Silverlight обладает мощными механизмами взаимодействия со службами по HTTP;

· Поддержка развертывание Silverlight-приложений в режиме «песочницы». Подобный режим позволяет выполнять развертывание решений под SharePoint, используя только права администратора коллекции сайтов. Ранее, чтобы развернуть любое решение в SharePoint, необходимо было иметь права администратора всего сервера. Иными словами, чтобы добавить Silverlight-приложение на свой сайт, Вам не нужно быть администратором сервера. На самом деле, если Вы разворачиваете только .xap-файл, то можно обойтись и без прав владельца коллекции, но если Вы разворачиваете решение, содержащие набор фич (feature – вот так в SharePoint называется единица развертывания), то без прав владельца не обойтись;

· Тесная интеграция с существующим интерфейсом SharePoint 2010. Так, если у пользователя установлен Silverlight, то многие диалоговые окна и элементы навигации приобретают дополнительные интерфейсные возможности, делая интерфейс более «приятным». В качестве примера можно рассмотреть интерфейс окна, позволяющего создавать сайты внутри коллекции:

image

@1 Пример диалогового окна Create, реализованного в SharePoint на SilverLight

Итак, сделав обзор всех аспекты интеграции Silverlight и SharePoint 2010, перейдем к детальному изучению некоторых из них.

Продолжение следует.

Written by Sergiy Baydachnyy

05.02.2010 at 07:54

Опубликовано в SharePoint, SilverLight

Tagged with ,

Введение в SilverLight 4: Повышение доверия

4 комментария

Как страшно жить! При создании SilverLight 2 и 3, в Microsoft задумывались о том, чтобы реализовать возможность размещения приложений в различных группах безопасности кода (подобие Code Access security). Данный подход не только не был реализован, но и принадлежность всех SilverLight-приложений к единому контексту безопасности (Web «песочнице») позиционировалось как преимущество технологии. Ведь если в данном контексте нет прав, например, на форматирование жесткого диска, то даже при наличии ошибок в приложении разработчика, возможность для атаки будет отсутствовать.

В SilverLight 4 ситуация координально изменилась. Теперь приложениям, устанавливаемым для работы вне браузера, можно назначать контекст безопасности с повышенными правами. Чтобы сделать это, достаточно немного изменить конфигурационный файл, установиви атрибут ElevatedPermissions в значение Required:

<OutOfBrowserSettings.SecuritySettings>
   <SecuritySettings ElevatedPermissions="Required" />
</OutOfBrowserSettings.SecuritySettings>

При инсталяции такого приложения пользователь получает вот такое окно:

image

Несмотря на то, что вид окна отличается от того, который используется для инсталяции обычных приложений, работающих вне браузера, нужно помнить, что приложения разрабатываются для обычных пользователей. Я встречал громадное количество пользователей, которые смело жмут кнопку Install, не читая предупреждений (или игнорируя их). Поэтому данная возможность безопасна скорее для корпоративных пользователей, где у администратора есть возможность запретить установку всех приложений, требующих повышенный полномочий. При этом, перед установкой запрета, можно установить все необходимые приложения, которые после установки запрета будут работать и дальше.

Если говорить о пользователях Интернет, то давайте рассмотрим, какими правами обладают приложения с повышенным доверием.

Расширенные возможности работы в полноэкранном режиме

В стандартных SilverLight-приложениях нельзя перейти в полноэкранный режим без реакции на событие, инициированное пользователем. Кроме того, в полноэкранном режиме действуют ограничения, связанные с клавиатурой (невозможен ввод).

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

Отсутствие сообщений о доступе к ресурсам

При работе с буфером обмена и другими внешними ресурсами (камера, микрофон), пользователь не будет получать сообщения, позволяющие разрешить или запретить доступ. При этом, такие классы как Clipboard, можно использовать в любом месте кода.

Запросы между доменами

Следующая возможность, доступная для приложений с повышенным доверием, это отправка запросов службам и приложениям, находящимся в любом домене. При этом не важно, какую конфигурацию имеет удаленным домен. Данная функциональность безвредна для пользователя, но незаменимая при организации DOS-атакJ

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

В режиме с повышенным доверием, приложение получает полный контроль к некоторым специальным папкам, ассоциированными с пользователем: MyDocuments, MyVideos, MyPictures, MyMusic. Пути к указанным папкам можно получить, используя статический класс Environment. При этом нужно отметить, что SilverLight-приложение работает только с папками, но не с библиотеками (Win 7).

Данная возможность хоть и ограничена, но одна из самых опасных. Я не вижу никаких ограничений, запрещающих мне записать исполняемый файл в одну из этих папок, а затем запустить его. Если при этом пользователь имеет выключенным нотификации UAC (Windows 7), то права такого приложения будут неограниченные.

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

И, наконец, самая интересная возможность – доступ к COM API.

С одной стороны это означает, что теперь разработчик может получить доступ к COM-модели таких продуктов как Word и Excel. Это позволит создавать документы «на лету» и заполнять их данными, выбранными пользователем из внешних хранилищ.

С другой стороны, пользователь обычно имеет достаточно большой спектр COM-объектов, установленных по умолчанию. Например, WScript, позволяющий запускать приложения из любой директории на вашей машине (даже те, которые Вы можете скопировать, используя предыдущую возможностьJ):

dynamic cmd = ComAutomationFactory.CreateObject("WScript.Shell");
cmd.Run(string.Format(writerApp, @ArgumentFileBox.Text),1, true);

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

В завершении темы хочу отметить, что объект Application имеет специальное свойство HasElevatedPermissions, которое позволяет проверить, запущено ли это приложение с повышенным доверием. Свойство имеет смысл, если Вы будете делать инсталяции сразу двух типов приложений, работающих вне браузера (с повышенным доверием и стандартное).

Written by Sergiy Baydachnyy

15.01.2010 at 13:11

Опубликовано в SilverLight

Tagged with

Введение в SilverLight 4: Неявные стили

leave a comment »

На этот раз рассмотрим возможность, облегчающую работу при построении интерфейса приложения.

В предыдущих версиях SilverLight, чтобы иметь возможность установить новый стиль одному или нескольким элементам управления, разработчик должен был создать именованный стиль и установить имя созданного стиля для каждого из элементов управления.

То есть стиль мог выглядеть следующим образом:

<Style TargetType="Button" x:Key="btnStyle">
 <Setter Property="FontFamily" Value="Arial Black"></Setter>
 <Setter Property="Background" Value="Green"></Setter>
 <Setter Property="FontStyle" Value="Italic"></Setter>
 <Setter Property="Foreground" Value="Red"></Setter>
</Style>

А код, устанавливающий стиль для конкретного элемента мог выглядеть так:

<Button Style="{StaticResource btnStyle}" 
 Content="Hello" Width="100" Height="50"></Button>

Теперь, при определении стиля, от атрибута x:Key можно избавится. Это будет означать, что указанный стиль будет использован неявно для всех элементов заданного типа. Естественно, если в элементе прописать стиль явно, то неявный стиль для этого элемента будет игнорироваться.

Written by Sergiy Baydachnyy

15.01.2010 at 08:02

Опубликовано в SilverLight

Tagged with

Введение в SilverLight 4: Работа с камерой и микрофоном

22 комментария

Еще одна потрясающая возможность SilverLight 4, это поддержка камеры и микрофона. Чтобы показать эти возможности в действии, рассмотрим небольшой пример. Для этого создадим новый SilverLight-проект и реализуем следующий интерфейс:

<UserControl x:Class="WebCam_Chapter0.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel x:Name="LayoutRoot" Background="White" 
        Loaded="LayoutRoot_Loaded">
        <Rectangle Width="400" Height="300" Fill="Gray" 
            Name="videoContainer">
        </Rectangle>
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
            <StackPanel>
                <TextBlock Text="Video Devices" Margin="5"></TextBlock>
                <ListBox Height="30" Name="videoBox">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock 
                             Text="{Binding FriendlyName}">
                            </TextBlock>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </StackPanel>
            <StackPanel>
                <TextBlock Text="Audio Devices" Margin="5"></TextBlock>
                <ListBox Height="30" Name="audioBox">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock 
                             Text="{Binding FriendlyName}">
                            </TextBlock>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </StackPanel>
        </StackPanel>
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
            <Button Content="Start" Width="100" Height="30" 
                Click="Start_Click" Margin="5"></Button>
            <Button Content="Stop" Width="100" Height="30" 
                Click="Stop_Click" Margin="5"></Button>
            <Button Content="Capture" Width="100" Height="30" 
                Margin="5" Click="Capture_Click"></Button>
        </StackPanel>
        <ScrollViewer Width="500" Height="200" 
            HorizontalScrollBarVisibility="Visible" 
            VerticalScrollBarVisibility="Hidden">
            <ItemsControl Name="imageContainer">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Image Source="{Binding}" 
                         Stretch="UniformToFill" 
                         Height="150" Margin="5">
                        </Image>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal" 
                         VerticalAlignment="Center" 
                         HorizontalAlignment="Center">
                        </StackPanel>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </ScrollViewer>
    </StackPanel>
</UserControl>

Предложенный интерфейс будет выглядеть так, как на рисунке ниже:

image

Элемент Rectangle мы будем использовать для отображения видео, два элемента ListBox – для выдачи списка доступных устройств, а ScrollView элемент – для отображения изображений, захваченных во время отображения видео.

Итак, получить аудио и видео потоки можно с помощью класса CaptureSource. Структура этого класса достаточно простая, так, тут можно выделить два всего два основных метода и три основных свойства:

· Start – инициирует доступ объекта типа CaptureSource к аудио и видео потокам;

· Stop – закрывает доступ к видео и аудио потокам;

· VideoCaptureDevice – задает устройство для получения видео потока;

· AudioCaptureDevice – задает устройство для получения аудио потока;

· State – определяет состояние объекта типа CaptureSource: Started – запушен и получает потоки; Stopped – остановлен; Failed – проблемы с подключением.

Таким образом, чтобы приступить к работе с видео и аудио, необходимо создать объект типа CaptureSource:

private CaptureSource _source = new CaptureSource();

Прежде, чем запустить работу с потоками, необходимо выбрать и установить устройства. Для этих целей используется класс CaptureDeviceConfiguration, содержащий несколько статических методов:

· GetAvailableAudioCaptureDevices – возвращает список доступных аудио устройств (как набор объектов типа AudioCaptureDevice);

· GetAvailableVideoCaptureDevices – возвращает список доступных видео устройств (как набор объектов типа VideoCaptureDevice);

· GetDefaultAudioCaptureDevice – возвращает устройство по умолчанию;

· GetDefaultVideoCaptureDevice – возвращает устройство по умолчанию.

Таким образом, чтобы получить список всех устройств, реализуем код:

audioBox.ItemsSource = 
  CaptureDeviceConfiguration.GetAvailableAudioCaptureDevices();
videoBox.ItemsSource = 
  CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices();

В свою очередь, код, устанавливающий выбранные устройства объекту типа CaptureSource, во время запуска работы с потоками, будет выглядеть следующим образом:

_source.VideoCaptureDevice = (VideoCaptureDevice)videoBox.SelectedItem;
_source.AudioCaptureDevice = (AudioCaptureDevice)audioBox.SelectedItem;

Теперь наша задача использовать CaptureSource для вывода видео на экран. Для этого мы и будем использовать элемент Rectangle и объект типа VideoBrush для его заливки:

VideoBrush vBrush = new VideoBrush();
vBrush.SetSource(_source);
videoContainer.Fill = vBrush;

Создав объект типа CaptureSource и установивив все необходимые параметры, можно приступать к вызову метода Start. Но, прежде чем сделать это, необходимо проверить, имеет ли приложение права на доступ к устройствам, а если не имеет, то права необходимо запросить у пользователя. Проверить наличие прав и запросить доступ можно с помощью уже знакомого класса CaptureDeviceConfiguration. Для этого используется свойство AllowedDeviceAccess и метод RequestDeviceAccess соответственно. Таким образом, код, выполняющий запуск объекта типа CaptureSource, должен выглядеть следующим образом:

    if (CaptureDeviceConfiguration.AllowedDeviceAccess 
       || CaptureDeviceConfiguration.RequestDeviceAccess())
    {
        _source.Start();
    }

Выше были перечисленны основные действия, которые необходимо проделать для отображения видео в SilverLight-приложении. Естественно к данному коду необходимо добавить различные проверки и реализовать механизм захвата изображения. Детально я это расписывать не буду, а прото приведу готовый код:

private CaptureSource _source = new CaptureSource();
private ObservableCollection<WriteableBitmap> _images = 
    new ObservableCollection<WriteableBitmap>();
 
public MainPage()
{
    InitializeComponent();
}
 
private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
{
    audioBox.ItemsSource = 
      CaptureDeviceConfiguration.GetAvailableAudioCaptureDevices();
    videoBox.ItemsSource = 
      CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices();
 
    if ((videoBox.Items.Count > 0) && (audioBox.Items.Count > 0))
    {
        videoBox.SelectedIndex = 0;
        audioBox.SelectedIndex = 0;
    }
 
    imageContainer.ItemsSource = _images;
}
 
private void Stop_Click(object sender, RoutedEventArgs e)
{
    _source.Stop();
}
 
private void Start_Click(object sender, RoutedEventArgs e)
{
    if ((videoBox.Items.Count==0)||(audioBox.Items.Count==0))
    {
        MessageBox.Show("Audio or Video device is not available");
        return;
    }
 
    _source.VideoCaptureDevice = (VideoCaptureDevice)videoBox.SelectedItem;
    _source.AudioCaptureDevice = (AudioCaptureDevice)audioBox.SelectedItem;
 
    VideoBrush vBrush = new VideoBrush();
    vBrush.SetSource(_source);
 
    videoContainer.Fill = vBrush;
 
    if (CaptureDeviceConfiguration.AllowedDeviceAccess 
       || CaptureDeviceConfiguration.RequestDeviceAccess())
    {
        _source.Start();
    }
}
 
private void Capture_Click(object sender, RoutedEventArgs e)
{
    if (_source.State == CaptureState.Started)
    {
        _source.AsyncCaptureImage(CaptureImage<WriteableBitmap>);
    }
}
 
private void CaptureImage<WriteableBitmap>(
    System.Windows.Media.Imaging.WriteableBitmap t)
{
    _images.Add(t);
}

При запуске данного приложения должно получится что-то такое (если Вы увидете свое лицо, то не расстраивайтесь, так задумано):

image

В завершении хочу отметить два класса: AudioSink и VideoSink, которые позволяют получить доступ к видео и аудио как к набору байтов. Оба класса абстрактные, поэтому от разработчика потребуется определить собственные классы и несколько методов.

Written by Sergiy Baydachnyy

14.01.2010 at 15:01

Опубликовано в SilverLight

Tagged with

Введение в SilverLight 4: Элемент управления ViewBox

with one comment

Чтобы продемонстрировать работу нового элемента управления ViewBox, достаточно рассмотреть небольшой пример:

<UserControl x:Class="ViewBox_Chapter0.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid x:Name="LayoutRoot" Background="White">
        <StackPanel>
            <Button Content="Hello" Width="400" Height="100"></Button>
        </StackPanel>
    </Grid>
</UserControl>

Если попробовать запустить приложение выше, и изменить размер окна браузера, то можно увидеть что размер кнопки остается неизменным. Если изменить размер окна браузера, сделав его меньшим размера кнопки, то она попросту перестанет влазить на экран. Таким образом, существует проблема изменения размеров интерфейса при изменении размеров окна браузеров. Конечно, данную проблему можно решить с помощью элемента компоновки Grid, но при работе со сложными интерфейсами, элемент Grid не помогает. Поэтому появление элемента ViewBox, позволяющего сжимать и расширять свое содержимое, является даже запоздалым.

Замечание. Элемент ViewBox был доступен и разработчикам более ранней версии SilverLight, но не входил в стандартную поставку, а поставлялся в составе специальной библиотеки с открытым кодом, разрабатываемой сообществом.

Рассмотрим пример выше, но добавим элемент компоновки ViewBox:

<UserControl x:Class="ViewBox_Chapter0.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid x:Name="LayoutRoot" Background="White">
        <Viewbox MaxHeight="200" MaxWidth="800" 
            MinHeight="50" MinWidth="200">
            <StackPanel>
                <Button Content="Hello" Width="400" Height="100"></Button>
            </StackPanel>
        </Viewbox>
    </Grid>
</UserControl>

Теперь, при изменении размеров окна браузера, также изменяется и размер нашей кнопки.

Рассмотрим элемент ViewBox более детально. Фактически тут можно выделить всего три основных свойства: Child, Stretch, StretchDirection.

Свойство Child содержит ссылку на тот элемент, размерами которого управляет ViewBox. Тут может быть только один элемент, но это может быть и контейнер (как в примере выше).

Свойство Stretch определяет, каким образом содержимое ViewBox размещается внутри выделенного пространства. Тут возможно одно из следующих значений:

· None – сохранять исходный размер контента;

· Fill – полностью заполнить элемент ViewBox, не сохраняя пропорции;

· Uniform – сохранять пропорции контента;

· UniformToFill – полностью заполнить элемент ViewBox, с сохранением пропорций контента. Естественно, что с этим параметром, в большинстве случаев, весь контент отобразить не удается и он выходит за границы ViewBox.

Последнее свойство StretchDirection позволяет разрешить только сжатие или расширение содержимого и принимает одно из значений:

· UpOnly – только расширять контент, если размер ViewBox больше размера самого контента;

· DownOnly – только сжимать контент, если размер ViewBox меньше размера самого контента;

· Both – позволяет расширять и сжимать контент (установлено по умолчанию).

Таким образом, в SilverLight 4 на один полезный элемент компоновки стало больше.

Written by Sergiy Baydachnyy

12.01.2010 at 10:28

Опубликовано в SilverLight

Tagged with