Software Development Kit (SDK) для Silverlight 2 включает два элемента управления ASP.NET, которые могут использоваться для поставки Silverlight-приложений в ASP.NET. Обратите внимание, что Silver-light можно использовать в ASP.NET и без этих элементов управления, но, несомненно, они намного упрощают задачу по управлению и доставке Silverlight-содержимого.
Начнем с элемента управления Silverlight. Он обеспечивает возможность использовать объявление ASP.NET на сервере, что создаст необходимые теги <OBJECT> и <PARAM> в браузере, позволяя использовать парадигму обработки на стороне сервера, хорошо знакомую разработчикам ASP.NET.
Второй элемент управления - MediaPlayer, который тоже обеспечивает модель объявления ASP.NET, но поставляет не универсальный элемент управления Silverlight, а приложение Silverlight-медиаплеера, со всеми его элементами управления и функциональностью.
В данной лекции мы рассмотрим оба этих элемента управления и свойства, методы и события, которые они предлагают разработчикам.
Подсказка Прежде чем использовать элементы управления ASP.NET Silverlight в своей Веб-форме, необходимо зарегистрировать сборку, в которую они входят. Обычно для этого используется следующий код в начале разметки страницы:
<%@ Register Assembly="System.Web.Silverlight"
Namespace="System.Web.UI.SilverlightControls"
TagPrefix="asp" %>
Элемент управления Silverlight находится в пространстве имен System.Web.UI.SilverlightControls.Silverlight. Заметьте, чтобы использовать его на странице, на ней должен присутствовать .
При создании Silverlight-приложения с использованием шаблона Microsoft Visual Studio также создается страница ASPX для размещения элемента управления ASP.NET Silverlight. Тег должен выглядеть примерно так:
<asp:Silverlight ID="Xaml1" runat="server"
Source="~/ClientBin/ASP1.xap" Version = "2.0"
Width="100%" Height="100%" />
Как видите, используется обычный синтаксис ASP.NET, т.е. свойства элемента управления задаются посредством атрибутов XML
Атрибут EnableFrameRateCounter позволяет видеть частоту кадров, обеспечиваемую в настоящий момент Silverlight. Так очень удобно контролировать производительность приложения, особенно при выполнении большого количества анимаций.
Например, рассмотрим следующее приложение XAML В нем выполняется анимация линии: ее разворот на 360 градусов:
<UserControl x:Class="ASP1.Page" xmlns=" http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xa ml" Width="400" Height="300"
xmlns:d = "http://schemas. microsoft. com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<UserControl.Resources>
<Storyboard x:Name="Storyboard1" RepeatBehavior="Forever">
<DoubleAnimationUsingKey Frames="" Storyboard.TargetName="path"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)"
BeginTime="00:00:00">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:04" Value="359"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<Ellipse HorizontalAlignment="Stretch" Margin="147,79,151,96" VerticalAlignment="Stretch"
RenderTransformOrigin="0.5,0.48" Fill= "#FF6A2020" Stroke="#FF000000"/>
<Path Height="115" HorizontalAlignment="Stretch" Margin="199.564,30.436,194.436,0"
x:Name="path" VerticalAlignment="Top"
RenderTransformOrigin="0.891,0.983" Fill = "#FFFFFFFF"
Stretch="Fill" Stroke="#FF000000"
StrokeThickness="6" Data = "M196,137.15463 L196,35.15464">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="0"/>
<TranslateTransform/>
</TransformGroup>
</Path.RenderTransform>
</Path>
<Button Height="30" HorizontalAlignment="Left" Margin="30,19,0,0" VerticalAlignment="Top"
Width="59" Content="Start" x:Name="btnStart" Click="btnStart Click"/>
</Grid>
</UserControl>
Для Button описано событие Click. Код обработки события Click просто запускает анимацию :
private void btnStart Click(object sender, RoutedEventArgs e)
{
Story boa rd1.Begin();
}
Чтобы увидеть частоту кадров, активируйте счетчик частоты кадров в элементе управления ASP.NET Silverlight:
<asp:Silverlight ID="Xaml1" runat="server"
Source="~/ClientBin/ASP1.xap" Version = "2.0"
Width=" 100%" Height="100%" EnableFrameRateCounter="true" />
При выполнении приложения по нажатию кнопки запускается анимация. При этом в строке состояния браузера будет отображаться частота кадров. Это можно увидеть на рис. 13.1.
(рис 13.1) Использование частоты кадров для элемента управления SilverlightРекомендуется использовать эту возможность только во время отладки; отключите ее для рабочих приложений.
По умолчанию частота смены кадров в Silverlight составляет 60 кадров в секунду. Это означает, что все анимации с использованием временной шкалы разделяются на приращения свойств так, что свойство меняется 60 раз в секунду. Например, чтобы развернуть линию на 360 градусов за 1 секунду, анимация была бы разделена на 60 равных операций, каждая из которых осуществляла бы разворот на 6 градусов. Это может создавать большую вычислительную нагрузку, поэтому общую производительность можно повысить, снизив частоту кадров, или наоборот, если производительность не проблема и необходимо повысить плавность анимации приложения, можно увеличить частоту кадров.
Рассмотрим пример, в котором показано, как изменить частоту кадров до 10 кадров в секунду:
<asp:Silverlight ID="Xaml1" runat="server"
Source="~/ClientBin/ASP1.xap" Version="2.0"
Width = "100%" Height="100%" EnableFrameRateCounter="true"
MaxFrameRate="10" />
Если выполнить обсуждаемую ранее анимацию с вращением, вы заметите, что движение линии стало не таким плавным, как ранее. Также показания частоты, количество кадров в секунду (frames per second, fps), опустились до отметки 10 кадров в секунду (рис. 13.2).
(рис 13.2) Сокращение частоты кадров
С помощью свойства EnableHtmlAccess можно получить или задать для элемента управления Silverlight доступ к DOM HTML По умолчанию это свойство имеет значение true, что активирует доступ к DOM.
Для работы с DOM браузера в приложении используется пространство имен System.Windows.Browser. Это обеспечивает вам доступ к классам, таким как HtmlPage, используемым для запроса метаданных страницы, на которой располагается элемент управления Silverlight, а также возможность поиска определенного элемента в документе. Элементы HTML могут быть представлены в .NET классом HtmlElement (HTML-элемент).
Например, если в HTML имеется элемент <DIV> под именем testDiv, к нему можно обращаться и изменять из кода Silverlight следующим образом:
HtmlElement testDiv = HtmlPage.Document.GetElementById("testDiv");
testDiv.SetAttribute("innerText", "This is the testDiv");
Очень полезный класс - HtmlPage.BrowserInformation, он предоставляет метаданные, такие как Browser Version (Версия браузера), Sub Version (Дополнительная версия), Name (Имя), Platform (Платформа), User Agent (Агент пользователя) и включена поддержка cookie или нет.
Вот пример его содержимого во время выполнения:
? HtmlPage.BrowserInformation {System.Windows.Browser.BrowserInformation}
BrowserVersion: {4.0}
CookiesEnabled: true
Name: "Microsoft Internet Explorer"
Platform: "Win32" UserAgent: "Mozilla/4.0 (compatible; MSIE 7.0;
Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0;
.NET CLR 3.0.04506; InfoPath.2; .NET CLR 3.5.21022; MS-RTC LM 8)"
? Html Page.BrowserInformation.BrowserVersion {4.0}
Build: -1
Major: 4
Minor: 0 Revision: -1
Другой наглядный пример, который поможет понять работу приложения Silverlight, - концепция перерисовываемой области (Redraw Region).Это визуальный индикатор, указывающий на части элемента управления Silverlight, которые перерисовываются. С помощью атрибута EnableRedrawRegions, задавая ему значение true вместо используемого по умолчанию false, можно включить эти маркеры. Итак, если вернуться к примеру с вращающейся линией и изменить разметку элемента управления ASP.NET, как показано в следующем коде, индикация перерисовываемых областей будет включена:
<asp:Silverlight ID="Xaml1" runat="server"
Source="~/ClientBin/ASP1.xap" Version="2.0"
Width = "100%" Height="100%"
EnableFrameRateCounter="true" EnableRedrawRegions="true" />
На рис. 13.3 показан создаваемый этим кодом эффект; перерисовываемые области выделены.
(рис 13.3) Использование перерисовываемых областейКак и с частотой кадров, эту возможность рекомендуется использовать только для отладки приложений и выключать при переходе к производственной эксплуатации.
С помощью свойства PluginBackground (Фон подключаемого модуля) можно задавать цвет фона подключаемого модуля. Вспомним, что элемент управления ASP.NET выполняется на сервере и формирует разметку, что позволяет использовать свойства System.Color, включая некоторые системные цвета (такие как Window или ActiveBorder ), и также именованные системные цвета.
Как можно увидеть на рис. 13.4, Visual Studio IntelliSense позволяет выбирать системные и именованные цвета для фона подключаемого модуля.
(рис 13.4) Задание цвета фона подключаемого модуляНа рис. 13.5 показано, как будет выглядеть содержимое Silverlight, когда свойству PluginBackground задано значение WindowFrame. Заметьте, что вам придется изменить фон элемента управления Grid в XAML, или он переопределит это значение. Если вы хотите, чтобы цвет фона подключаемого модуля распространялся на все элементы, можно просто удалить это свойство в других элементах.
(рис 13.5) Использование системного цвета в качестве цвета фона подключаемого модуляЕсли сейчас взглянуть на исходный код страницы, можно увидеть, что значение параметра Background объекта Grid с именем LayoutRoot жестко задано в коде. В примере, представленном на рис. 13.5 для подключаемого модуля задан цвет фона #FF646464.
Если в системе клиента не установлен Silverlight, при переходе на страницу, включающую содержимое Silverlight, пользователь увидит стандартный значок установки Silverlight, как показано на рис. 13.6.
(рис 13.6) Стандартный значок установкиПереопределить это поведение можно специальным
Итак, изменить схему установки для Silverlight можно с помощью дочернего тега <PluginNotInstalledTemplate> (Шаблон 'подключаемый модуль не установлен') элемента управления ASP.NET Silverlight. Рассмотрим пример:
<asp:Silverlight ID="Xaml1" runat="server"
Source="~/ClientBin/ASP1.xap" Version = "2.0"
Width="100%" Height="100%" PluginBackground = "WindowFrame" >
<PluginNotInstalledTemplate>
<a href="http://www.microsoft.com/silverlight/handlers/getsilverlight.ashx?v=2.0">
If you want to install the Silverlight control, you can click here! 1
</a>
</PluginNotInstalledTemplate>
</asp:Silverlight>
Здесь используется гиперссылка (тег <a> ) на вышеупомянутый URL по которому располагается элемент управления Silverlight, и также задается некоторый доброжелательный текст. Конечно, можно предоставить пользователям что-то намного более вычурное, но здесь мы просто демонстрируем возможности. Попадая на вашу страницу, пользователь, не имеющий Silverlight, будет видеть содержимое, которое покажет, как установить Silverlight. Если Silverlight у пользователя установлен, он будет видеть Silverlight-содержимое.
Пользователь может менять размер браузера, при этом желательно, чтобы элемент управления Silver-light менялся соответственно. Это можно реализовать в коде, перехватывая события изменения размеров, или автоматически с помощью свойства ScaleMode (Режим масштабирования).
Существует три возможных значения этого свойства:
None Содержимое будет оставаться как есть, поэтому даже при изменении размера браузера, размеры содержимого будут оставаться неизменными.
Stretch Silverlight-содержимое будет менять размеры при изменении размера браузера и менять пропорции соответственно.
Zoom Silverlight-содержимое будет менять размеры при изменении размера браузера, но будет сохранять свои пропорции.
Рис.13.7 и 13.8 демонстрируют использование Stretch и Zoom, соответственно.
(рис 13.7) Stretch меняет пропорции
(рис 13.8) Zoom меняет размер содержимого, но не пропорции
По умолчанию Silverlight перекрывает все содержимое HTML-страницы, попадающее в область его отображения. Используя режим Windowless, можно обеспечить обратное поведение, т.е. HTML-содержимое будет отображаться поверх содержимого Silverlight. Это полезно, если требуется улучшить существующие приложения с помощью Silverlight. Элементы управления HTML (или другой HTML, создаваемый ASP.NET, JSP или другими серверами) могут просто отображаться поверх содержимого Silverlight. Например, есть элементы управления, доступные в HTML и недоступные (пока) в Silverlight, такие как редактор
Рассмотрим пример:
<asp:ScriptManager ID="ScriptManager1" runat= "server">
</asp:ScriptManager>
<div style="position: absolute; width: 600px; height: 100px; z-index: 1;
left: 0px; top: 0px">
<form action="">
<textarea style="height:100px; width:300px; left:30px; top:30px"
title="TextArea">
</textarea>
</form>
</div>
<div style="position: absolute; height:100%;top:0px;">
<asp:Silverlight ID="Xaml1" runat="server"
Source="~/ClientBin/ASP1.xap" Version="2.0"
Width = "100%" Height="100%" PluginBackground="WindowFrame"
ScaleMode="Stretch" Windowless="true">
</asp:Silverlight>
</div>
Обратите внимание, что для элементов <DIV>, включающих TextArea (Текстовая область), и Silverlight-содержимого задана абсолютная позиция 0 пикселов от верхней границы. Таким образом, они будут находиться в одном и том же месте на экране. Если бы параметру Windowless не было задано значение true, мы видели бы только Silverlight-содержимое. Однако когда Windowless задано значение true, HTML-содержимое отображается сверху (рис. 13.9).
(рис 13.9) Использование режима Windowless в SilverlightРежим Windowless следует использовать аккуратно, потому что он может оказывать негативное влияние на производительность, особенно при большом количестве анимаций.
Серверный элемент управления также предоставляет ряд событий, которые могут перехватываться обработчиками событий JavaScript. К ним относятся:
OnPluginError ( Ошибка подключаемого модуля ) Определяет функцию JavaScript, которая будет вызываться при возникновении любой ошибки в приложении Silverlight. Это подробно обсуждается в лекц. 5, "Трансформация и анимация в XAML".OnPluginFullScreenChanged ( Переход подключаемого модуля к полноэкранному режиму ) Определяет функцию JavaScript, которая будет вызываться при переходе к полноэкранному режиму. Не существует способа перехода к полноэкранному режиму автоматически, но элемент управления имеет свойство ( isFullScreen ), которое может меняться на основании действия пользователя. Если требуется реагировать на это событие, возможно, изменяя компоновку экрана, это можно делать в обработчике событий, определенному OnPluginFullScreeenChanged.OnPluginLoaded ( Подключаемый модуль загружен ) Определяет функцию JavaScript, которая будет вызываться по завершении загрузки подключаемого модуля. Более подробно это обсуждается в лекц. 5.OnPluginResized ( Изменение размера подключаемого модуля ) Определяет функцию JavaScript, которая будет вызываться при каждом изменении размеров подключаемого модуля, что обычно происходит, если в качестве режима растяжения задан Stretch или Zoom (обсуждается ранее в данной лекции), и пользователь меняет размеры браузера.Таким образом, элемент управления ASP.NET позволяет задавать все, необходимое объекту, выполняющемуся на стороне клиента. То есть, можно делать все то же самое, что вы делали с помощью тега <Object> и при помощи ASP.NET!
Элемент управления MediaPlayer обеспечивает доставку полнофункционального Silverlight-медиаплеера (видео и/или аудио) на страницу. Он предоставляет ряд шаблонов оформления, которые не только обеспечивают представление медиаплеера, но также полную функциональность управления воспроизведением, остановкой, приостановкой, маркерами, звуком, переходом в полноэкранный режим и многое другое. Также хочу обратить внимание, что элемент управления ASP.NET MediaPlayer имеет все свойства, методы и события типового элемента управления Silverlight, который обсуждался в первой части данной лекции. Таким образом, все, что было сказано о нем здесь, включая настройку Windowless или других свойств, также может применяться к MediaPlayer.
Работать с элементом управления MediaPlayer очень легко: необходимо просто добавить его экземпляр на рабочую поверхность Веб-формы ASP.NET. В верхнем правом углу имеется кнопка, открывающая помощник MediaPlayer Tasks (Задания MediaPlayer), как показано на рис. 13.10.
(рис 13.10) Использование элемента управления MediaPlayerПомощник MediaPlayer Tasks поможет задать основные свойства, которые обеспечат использование медиаплеера на вашем сайте:
Щелкните ссылку Import Skin (Импортировать шаблон оформления), чтобы импортировать один из предоставляемых шаблонов. По умолчанию они хранятся в каталоге C:\Program Files\Microsoft SDKs\Silverlight \v2.0 \Libraries \Server \MediaPlayerSkins.
Auto-Play-false (флажок не установлен).Если внимательней посмотреть на рис. 13.11, можно заметить, что ползунок громкости установлен посередине, потому что значение громкости по умолчанию в помощнике MediaPlayer Tasks (рис. 13.10) -0,5. Это демонстрирует гибкость данного элемента управления; вы можете настраивать медиаплеер соответственно конкретным нуждам своего приложения.
(рис 13.11) Медиаплеер, поставляемый MediaControlСуществует ряд других свойств, которые не представлены в помощнике MediaPlayer Tasks. Например, свойство AutoLoad (Автозагрузка). Когда ему задано значение true, мультимедиа автоматически загружается в базовый элемент управления, несмотря на действия пользователя. Когда AutoLoad задано значение false, мультимедиа не будет загружаться до тех пор, пока пользователь или программа не начнут воспроизведение.
Свойство EnableCaptions (Включить титры) используется для включения/выключения скрытых титров, если они кодированы в потоке.
Прежде чем продолжить наш разговор, не помешало бы найти подходящий медиафайл, содержащий маркеры. Хороший пример того, как это можно сделать, представлен в лекц. 11, "Мультимедиа, рукописный ввод и Deep Zoom".
Если в видеопотоке кодированы маркеры, можно написать код, реагирующий на них, и элемент мультимедиа Silverlight будет формировать события, при встрече с этими маркерами. При использовании серверного элемента управления ASP.NET необходим способ ассоциировать эти маркеры с функциями-обработчиками. Рад сообщить, что существуют атрибуты, позволяющие сделать это. Например, OnClientChapterStarted (Начало раздела) определяет функцию JavaScript, которая будет вызываться в начале каждого нового раздела видео. Разделы определяются в Expression Encoder и кодируются в видео или задаются в разметке ASP.NET. Вот пример второго варианта:
<asp:MediaPlayer ID="MediaPlayer1" ScaleMode="Stretch "
runat="server" MediaSource="~/ClientBin/balls.wmv"
Height="325px" MediaSkinSource="~/Classic.xaml"
Width = "461px" OnClientChapterStarted = "doChapter" >
<Chapters>
<asp:MediaChapter Position ="1.0" Title = "Chapter1" />
<asp:MediaChapter Position="2.0" Title = "Chapter2" />
</Chapters>
</asp:MediaPlayer>
По достижении очередного раздела будет вызываться JavaScript-функция, определенная в OnClientChapterStarted.
С помощью свойства currentState элемента управления MediaElement можно отслеживать, что происходит с мультимедиа. Это рассматривается в лекц. 11. Данное свойство возвращает значения, представляющие текущее состояние воспроизведения мультимедиа, такие как "playing" (воспроизведение), "buffering" (буферизация), "paused" (приостановлено) и т.д. Если необходимо настроить обработчик события, например, события, которое формируется при изменении состояния, используется атрибут OnCurrentStateChanged элемента управления ASP.NET, определяющий необходимую JavaScript-функцию.
Маркеры подобны разделам с той точки зрения, что они тоже являются фрагментами метаданных, кодированными в видеопоток. По умолчанию все маркеры определены как разделы. С помощью атрибута OnMarkerReached (По достижении маркера) элемента управления ASP.NET можно задать JavaScript-функцию, которая будет вызываться при встрече с маркером.
Кроме того, можно задать действия, выполняющиеся при открытии, закрытии и сбое мультимедиа, используя атрибуты OnMediaOpened (При открытии мультимедиа) , OnMediaEnded (При закрытии мультимедиа) и OnMediaFailed (При сбое мультимедиа), соответственно.
В данной лекции рассмотрены два элемента управления ASP.NET, поставляемых с Silverlight SDK. Элемент управления Silverlight используется для управления и развертывания Silverlight-содержимого с использованием парадигмы программирования на стороне сервера. Элемент управления MediaPlayer используется для доставки клиентам медиасодержимого с разным стилевым оформлением. Это чрезвычайно полезные с точки зрения производительности средства в случае использования ASP.NET для доставки Silverlight сайта, и они, безусловно, заслуживают времени, потраченного на их изучение. В следующей лекции рассматривает новое захватывающее дополнение Silverlight 2 - поддержка динамических языков.
Software Development Kit (SDK) для Silverlight 2 включает два элемента управления ASP.NET, которые могут использоваться для поставки Silverlight-приложений в ASP.NET. Обратите внимание, что Silver-light можно использовать в ASP.NET и без этих элементов управления, но, несомненно, они намного упрощают задачу по управлению и доставке Silverlight-содержимого.
Начнем с элемента управления Silverlight. Он обеспечивает возможность использовать объявление ASP.NET на сервере, что создаст необходимые теги <OBJECT> и <PARAM> в браузере, позволяя использовать парадигму обработки на стороне сервера, хорошо знакомую разработчикам ASP.NET.
Второй элемент управления - MediaPlayer, который тоже обеспечивает модель объявления ASP.NET, но поставляет не универсальный элемент управления Silverlight, а приложение Silverlight-медиаплеера, со всеми его элементами управления и функциональностью.
В данной лекции мы рассмотрим оба этих элемента управления и свойства, методы и события, которые они предлагают разработчикам.
Подсказка Прежде чем использовать элементы управления ASP.NET Silverlight в своей Веб-форме, необходимо зарегистрировать сборку, в которую они входят. Обычно для этого используется следующий код в начале разметки страницы:
<%@ Register Assembly="System.Web.Silverlight"
Namespace="System.Web.UI.SilverlightControls"
TagPrefix="asp" %>
Элемент управления Silverlight находится в пространстве имен System.Web.UI.SilverlightControls.Silverlight. Заметьте, чтобы использовать его на странице, на ней должен присутствовать .
При создании Silverlight-приложения с использованием шаблона Microsoft Visual Studio также создается страница ASPX для размещения элемента управления ASP.NET Silverlight. Тег должен выглядеть примерно так:
<asp:Silverlight ID="Xaml1" runat="server"
Source="~/ClientBin/ASP1.xap" Version = "2.0"
Width="100%" Height="100%" />
Как видите, используется обычный синтаксис ASP.NET, т.е. свойства элемента управления задаются посредством атрибутов XML
Атрибут EnableFrameRateCounter позволяет видеть частоту кадров, обеспечиваемую в настоящий момент Silverlight. Так очень удобно контролировать производительность приложения, особенно при выполнении большого количества анимаций.
Например, рассмотрим следующее приложение XAML В нем выполняется анимация линии: ее разворот на 360 градусов:
<UserControl x:Class="ASP1.Page" xmlns=" http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xa ml" Width="400" Height="300"
xmlns:d = "http://schemas. microsoft. com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<UserControl.Resources>
<Storyboard x:Name="Storyboard1" RepeatBehavior="Forever">
<DoubleAnimationUsingKey Frames="" Storyboard.TargetName="path"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)"
BeginTime="00:00:00">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:04" Value="359"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<Ellipse HorizontalAlignment="Stretch" Margin="147,79,151,96" VerticalAlignment="Stretch"
RenderTransformOrigin="0.5,0.48" Fill= "#FF6A2020" Stroke="#FF000000"/>
<Path Height="115" HorizontalAlignment="Stretch" Margin="199.564,30.436,194.436,0"
x:Name="path" VerticalAlignment="Top"
RenderTransformOrigin="0.891,0.983" Fill = "#FFFFFFFF"
Stretch="Fill" Stroke="#FF000000"
StrokeThickness="6" Data = "M196,137.15463 L196,35.15464">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="0"/>
<TranslateTransform/>
</TransformGroup>
</Path.RenderTransform>
</Path>
<Button Height="30" HorizontalAlignment="Left" Margin="30,19,0,0" VerticalAlignment="Top"
Width="59" Content="Start" x:Name="btnStart" Click="btnStart Click"/>
</Grid>
</UserControl>
Для Button описано событие Click. Код обработки события Click просто запускает анимацию :
private void btnStart Click(object sender, RoutedEventArgs e)
{
Story boa rd1.Begin();
}
Чтобы увидеть частоту кадров, активируйте счетчик частоты кадров в элементе управления ASP.NET Silverlight:
<asp:Silverlight ID="Xaml1" runat="server"
Source="~/ClientBin/ASP1.xap" Version = "2.0"
Width=" 100%" Height="100%" EnableFrameRateCounter="true" />
При выполнении приложения по нажатию кнопки запускается анимация. При этом в строке состояния браузера будет отображаться частота кадров. Это можно увидеть на рис. 13.1.
(рис 13.1) Использование частоты кадров для элемента управления SilverlightРекомендуется использовать эту возможность только во время отладки; отключите ее для рабочих приложений.
По умолчанию частота смены кадров в Silverlight составляет 60 кадров в секунду. Это означает, что все анимации с использованием временной шкалы разделяются на приращения свойств так, что свойство меняется 60 раз в секунду. Например, чтобы развернуть линию на 360 градусов за 1 секунду, анимация была бы разделена на 60 равных операций, каждая из которых осуществляла бы разворот на 6 градусов. Это может создавать большую вычислительную нагрузку, поэтому общую производительность можно повысить, снизив частоту кадров, или наоборот, если производительность не проблема и необходимо повысить плавность анимации приложения, можно увеличить частоту кадров.
Рассмотрим пример, в котором показано, как изменить частоту кадров до 10 кадров в секунду:
<asp:Silverlight ID="Xaml1" runat="server"
Source="~/ClientBin/ASP1.xap" Version="2.0"
Width = "100%" Height="100%" EnableFrameRateCounter="true"
MaxFrameRate="10" />
Если выполнить обсуждаемую ранее анимацию с вращением, вы заметите, что движение линии стало не таким плавным, как ранее. Также показания частоты, количество кадров в секунду (frames per second, fps), опустились до отметки 10 кадров в секунду (рис. 13.2).
(рис 13.2) Сокращение частоты кадров
С помощью свойства EnableHtmlAccess можно получить или задать для элемента управления Silverlight доступ к DOM HTML По умолчанию это свойство имеет значение true, что активирует доступ к DOM.
Для работы с DOM браузера в приложении используется пространство имен System.Windows.Browser. Это обеспечивает вам доступ к классам, таким как HtmlPage, используемым для запроса метаданных страницы, на которой располагается элемент управления Silverlight, а также возможность поиска определенного элемента в документе. Элементы HTML могут быть представлены в .NET классом HtmlElement (HTML-элемент).
Например, если в HTML имеется элемент <DIV> под именем testDiv, к нему можно обращаться и изменять из кода Silverlight следующим образом:
HtmlElement testDiv = HtmlPage.Document.GetElementById("testDiv");
testDiv.SetAttribute("innerText", "This is the testDiv");
Очень полезный класс - HtmlPage.BrowserInformation, он предоставляет метаданные, такие как Browser Version (Версия браузера), Sub Version (Дополнительная версия), Name (Имя), Platform (Платформа), User Agent (Агент пользователя) и включена поддержка cookie или нет.
Вот пример его содержимого во время выполнения:
? HtmlPage.BrowserInformation {System.Windows.Browser.BrowserInformation}
BrowserVersion: {4.0}
CookiesEnabled: true
Name: "Microsoft Internet Explorer"
Platform: "Win32" UserAgent: "Mozilla/4.0 (compatible; MSIE 7.0;
Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0;
.NET CLR 3.0.04506; InfoPath.2; .NET CLR 3.5.21022; MS-RTC LM 8)"
? Html Page.BrowserInformation.BrowserVersion {4.0}
Build: -1
Major: 4
Minor: 0 Revision: -1
Другой наглядный пример, который поможет понять работу приложения Silverlight, - концепция перерисовываемой области (Redraw Region).Это визуальный индикатор, указывающий на части элемента управления Silverlight, которые перерисовываются. С помощью атрибута EnableRedrawRegions, задавая ему значение true вместо используемого по умолчанию false, можно включить эти маркеры. Итак, если вернуться к примеру с вращающейся линией и изменить разметку элемента управления ASP.NET, как показано в следующем коде, индикация перерисовываемых областей будет включена:
<asp:Silverlight ID="Xaml1" runat="server"
Source="~/ClientBin/ASP1.xap" Version="2.0"
Width = "100%" Height="100%"
EnableFrameRateCounter="true" EnableRedrawRegions="true" />
На рис. 13.3 показан создаваемый этим кодом эффект; перерисовываемые области выделены.
(рис 13.3) Использование перерисовываемых областейКак и с частотой кадров, эту возможность рекомендуется использовать только для отладки приложений и выключать при переходе к производственной эксплуатации.
С помощью свойства PluginBackground (Фон подключаемого модуля) можно задавать цвет фона подключаемого модуля. Вспомним, что элемент управления ASP.NET выполняется на сервере и формирует разметку, что позволяет использовать свойства System.Color, включая некоторые системные цвета (такие как Window или ActiveBorder ), и также именованные системные цвета.
Как можно увидеть на рис. 13.4, Visual Studio IntelliSense позволяет выбирать системные и именованные цвета для фона подключаемого модуля.
(рис 13.4) Задание цвета фона подключаемого модуляНа рис. 13.5 показано, как будет выглядеть содержимое Silverlight, когда свойству PluginBackground задано значение WindowFrame. Заметьте, что вам придется изменить фон элемента управления Grid в XAML, или он переопределит это значение. Если вы хотите, чтобы цвет фона подключаемого модуля распространялся на все элементы, можно просто удалить это свойство в других элементах.
(рис 13.5) Использование системного цвета в качестве цвета фона подключаемого модуляЕсли сейчас взглянуть на исходный код страницы, можно увидеть, что значение параметра Background объекта Grid с именем LayoutRoot жестко задано в коде. В примере, представленном на рис. 13.5 для подключаемого модуля задан цвет фона #FF646464.
Если в системе клиента не установлен Silverlight, при переходе на страницу, включающую содержимое Silverlight, пользователь увидит стандартный значок установки Silverlight, как показано на рис. 13.6.
(рис 13.6) Стандартный значок установкиПереопределить это поведение можно специальным
Итак, изменить схему установки для Silverlight можно с помощью дочернего тега <PluginNotInstalledTemplate> (Шаблон 'подключаемый модуль не установлен') элемента управления ASP.NET Silverlight. Рассмотрим пример:
<asp:Silverlight ID="Xaml1" runat="server"
Source="~/ClientBin/ASP1.xap" Version = "2.0"
Width="100%" Height="100%" PluginBackground = "WindowFrame" >
<PluginNotInstalledTemplate>
<a href="http://www.microsoft.com/silverlight/handlers/getsilverlight.ashx?v=2.0">
If you want to install the Silverlight control, you can click here! 1
</a>
</PluginNotInstalledTemplate>
</asp:Silverlight>
Здесь используется гиперссылка (тег <a> ) на вышеупомянутый URL по которому располагается элемент управления Silverlight, и также задается некоторый доброжелательный текст. Конечно, можно предоставить пользователям что-то намного более вычурное, но здесь мы просто демонстрируем возможности. Попадая на вашу страницу, пользователь, не имеющий Silverlight, будет видеть содержимое, которое покажет, как установить Silverlight. Если Silverlight у пользователя установлен, он будет видеть Silverlight-содержимое.
Пользователь может менять размер браузера, при этом желательно, чтобы элемент управления Silver-light менялся соответственно. Это можно реализовать в коде, перехватывая события изменения размеров, или автоматически с помощью свойства ScaleMode (Режим масштабирования).
Существует три возможных значения этого свойства:
None Содержимое будет оставаться как есть, поэтому даже при изменении размера браузера, размеры содержимого будут оставаться неизменными.
Stretch Silverlight-содержимое будет менять размеры при изменении размера браузера и менять пропорции соответственно.
Zoom Silverlight-содержимое будет менять размеры при изменении размера браузера, но будет сохранять свои пропорции.
Рис.13.7 и 13.8 демонстрируют использование Stretch и Zoom, соответственно.
(рис 13.7) Stretch меняет пропорции
(рис 13.8) Zoom меняет размер содержимого, но не пропорции
По умолчанию Silverlight перекрывает все содержимое HTML-страницы, попадающее в область его отображения. Используя режим Windowless, можно обеспечить обратное поведение, т.е. HTML-содержимое будет отображаться поверх содержимого Silverlight. Это полезно, если требуется улучшить существующие приложения с помощью Silverlight. Элементы управления HTML (или другой HTML, создаваемый ASP.NET, JSP или другими серверами) могут просто отображаться поверх содержимого Silverlight. Например, есть элементы управления, доступные в HTML и недоступные (пока) в Silverlight, такие как редактор
Рассмотрим пример:
<asp:ScriptManager ID="ScriptManager1" runat= "server">
</asp:ScriptManager>
<div style="position: absolute; width: 600px; height: 100px; z-index: 1;
left: 0px; top: 0px">
<form action="">
<textarea style="height:100px; width:300px; left:30px; top:30px"
title="TextArea">
</textarea>
</form>
</div>
<div style="position: absolute; height:100%;top:0px;">
<asp:Silverlight ID="Xaml1" runat="server"
Source="~/ClientBin/ASP1.xap" Version="2.0"
Width = "100%" Height="100%" PluginBackground="WindowFrame"
ScaleMode="Stretch" Windowless="true">
</asp:Silverlight>
</div>
Обратите внимание, что для элементов <DIV>, включающих TextArea (Текстовая область), и Silverlight-содержимого задана абсолютная позиция 0 пикселов от верхней границы. Таким образом, они будут находиться в одном и том же месте на экране. Если бы параметру Windowless не было задано значение true, мы видели бы только Silverlight-содержимое. Однако когда Windowless задано значение true, HTML-содержимое отображается сверху (рис. 13.9).
(рис 13.9) Использование режима Windowless в SilverlightРежим Windowless следует использовать аккуратно, потому что он может оказывать негативное влияние на производительность, особенно при большом количестве анимаций.
Серверный элемент управления также предоставляет ряд событий, которые могут перехватываться обработчиками событий JavaScript. К ним относятся:
OnPluginError ( Ошибка подключаемого модуля ) Определяет функцию JavaScript, которая будет вызываться при возникновении любой ошибки в приложении Silverlight. Это подробно обсуждается в лекц. 5, "Трансформация и анимация в XAML".OnPluginFullScreenChanged ( Переход подключаемого модуля к полноэкранному режиму ) Определяет функцию JavaScript, которая будет вызываться при переходе к полноэкранному режиму. Не существует способа перехода к полноэкранному режиму автоматически, но элемент управления имеет свойство ( isFullScreen ), которое может меняться на основании действия пользователя. Если требуется реагировать на это событие, возможно, изменяя компоновку экрана, это можно делать в обработчике событий, определенному OnPluginFullScreeenChanged.OnPluginLoaded ( Подключаемый модуль загружен ) Определяет функцию JavaScript, которая будет вызываться по завершении загрузки подключаемого модуля. Более подробно это обсуждается в лекц. 5.OnPluginResized ( Изменение размера подключаемого модуля ) Определяет функцию JavaScript, которая будет вызываться при каждом изменении размеров подключаемого модуля, что обычно происходит, если в качестве режима растяжения задан Stretch или Zoom (обсуждается ранее в данной лекции), и пользователь меняет размеры браузера.Таким образом, элемент управления ASP.NET позволяет задавать все, необходимое объекту, выполняющемуся на стороне клиента. То есть, можно делать все то же самое, что вы делали с помощью тега <Object> и при помощи ASP.NET!
Элемент управления MediaPlayer обеспечивает доставку полнофункционального Silverlight-медиаплеера (видео и/или аудио) на страницу. Он предоставляет ряд шаблонов оформления, которые не только обеспечивают представление медиаплеера, но также полную функциональность управления воспроизведением, остановкой, приостановкой, маркерами, звуком, переходом в полноэкранный режим и многое другое. Также хочу обратить внимание, что элемент управления ASP.NET MediaPlayer имеет все свойства, методы и события типового элемента управления Silverlight, который обсуждался в первой части данной лекции. Таким образом, все, что было сказано о нем здесь, включая настройку Windowless или других свойств, также может применяться к MediaPlayer.
Работать с элементом управления MediaPlayer очень легко: необходимо просто добавить его экземпляр на рабочую поверхность Веб-формы ASP.NET. В верхнем правом углу имеется кнопка, открывающая помощник MediaPlayer Tasks (Задания MediaPlayer), как показано на рис. 13.10.
(рис 13.10) Использование элемента управления MediaPlayerПомощник MediaPlayer Tasks поможет задать основные свойства, которые обеспечат использование медиаплеера на вашем сайте:
Щелкните ссылку Import Skin (Импортировать шаблон оформления), чтобы импортировать один из предоставляемых шаблонов. По умолчанию они хранятся в каталоге C:\Program Files\Microsoft SDKs\Silverlight \v2.0 \Libraries \Server \MediaPlayerSkins.
Auto-Play-false (флажок не установлен).Если внимательней посмотреть на рис. 13.11, можно заметить, что ползунок громкости установлен посередине, потому что значение громкости по умолчанию в помощнике MediaPlayer Tasks (рис. 13.10) -0,5. Это демонстрирует гибкость данного элемента управления; вы можете настраивать медиаплеер соответственно конкретным нуждам своего приложения.
(рис 13.11) Медиаплеер, поставляемый MediaControlСуществует ряд других свойств, которые не представлены в помощнике MediaPlayer Tasks. Например, свойство AutoLoad (Автозагрузка). Когда ему задано значение true, мультимедиа автоматически загружается в базовый элемент управления, несмотря на действия пользователя. Когда AutoLoad задано значение false, мультимедиа не будет загружаться до тех пор, пока пользователь или программа не начнут воспроизведение.
Свойство EnableCaptions (Включить титры) используется для включения/выключения скрытых титров, если они кодированы в потоке.
Прежде чем продолжить наш разговор, не помешало бы найти подходящий медиафайл, содержащий маркеры. Хороший пример того, как это можно сделать, представлен в лекц. 11, "Мультимедиа, рукописный ввод и Deep Zoom".
Если в видеопотоке кодированы маркеры, можно написать код, реагирующий на них, и элемент мультимедиа Silverlight будет формировать события, при встрече с этими маркерами. При использовании серверного элемента управления ASP.NET необходим способ ассоциировать эти маркеры с функциями-обработчиками. Рад сообщить, что существуют атрибуты, позволяющие сделать это. Например, OnClientChapterStarted (Начало раздела) определяет функцию JavaScript, которая будет вызываться в начале каждого нового раздела видео. Разделы определяются в Expression Encoder и кодируются в видео или задаются в разметке ASP.NET. Вот пример второго варианта:
<asp:MediaPlayer ID="MediaPlayer1" ScaleMode="Stretch "
runat="server" MediaSource="~/ClientBin/balls.wmv"
Height="325px" MediaSkinSource="~/Classic.xaml"
Width = "461px" OnClientChapterStarted = "doChapter" >
<Chapters>
<asp:MediaChapter Position ="1.0" Title = "Chapter1" />
<asp:MediaChapter Position="2.0" Title = "Chapter2" />
</Chapters>
</asp:MediaPlayer>
По достижении очередного раздела будет вызываться JavaScript-функция, определенная в OnClientChapterStarted.
С помощью свойства currentState элемента управления MediaElement можно отслеживать, что происходит с мультимедиа. Это рассматривается в лекц. 11. Данное свойство возвращает значения, представляющие текущее состояние воспроизведения мультимедиа, такие как "playing" (воспроизведение), "buffering" (буферизация), "paused" (приостановлено) и т.д. Если необходимо настроить обработчик события, например, события, которое формируется при изменении состояния, используется атрибут OnCurrentStateChanged элемента управления ASP.NET, определяющий необходимую JavaScript-функцию.
Маркеры подобны разделам с той точки зрения, что они тоже являются фрагментами метаданных, кодированными в видеопоток. По умолчанию все маркеры определены как разделы. С помощью атрибута OnMarkerReached (По достижении маркера) элемента управления ASP.NET можно задать JavaScript-функцию, которая будет вызываться при встрече с маркером.
Кроме того, можно задать действия, выполняющиеся при открытии, закрытии и сбое мультимедиа, используя атрибуты OnMediaOpened (При открытии мультимедиа) , OnMediaEnded (При закрытии мультимедиа) и OnMediaFailed (При сбое мультимедиа), соответственно.
В данной лекции рассмотрены два элемента управления ASP.NET, поставляемых с Silverlight SDK. Элемент управления Silverlight используется для управления и развертывания Silverlight-содержимого с использованием парадигмы программирования на стороне сервера. Элемент управления MediaPlayer используется для доставки клиентам медиасодержимого с разным стилевым оформлением. Это чрезвычайно полезные с точки зрения производительности средства в случае использования ASP.NET для доставки Silverlight сайта, и они, безусловно, заслуживают времени, потраченного на их изучение. В следующей лекции рассматривает новое захватывающее дополнение Silverlight 2 - поддержка динамических языков.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.