JavaScript в Silverlight
Вызов JavaScript функций из Silverlight
Для того, чтобы вызвать JavaScript функцию из Silverlight достаточно написать следующий код:
HtmlPage.Window.Invoke("DisplayMessage","Привет из Silverlight!");
Здесь мы вызываем JavaScript функцию DisplayMessage и передаём её в качестве параметра строку. Добавим этот код в обработчик события нажатия кнопки.
Теперь создадим данную JavaScript функцию на ASP.NET странице. Раздел head страницы будет выглядить так:
<head runat="server">
<title>MySilverlightApplication</title>
<script type="text/javascript">
function DisplayMessage(message) {
alert(message);
}
</script>
</head>
После этого при нажатии на кнопку выполняется JavaScript функция. Которая отображает сообщение с заданным текстом. Текст сообщения передаётся в параметре. Запустим приложение и проверим его работу.
Вызов Silverlight функций из JavaScript
Теперь пришло время вызывать из JavaScript функции в нашем Silverlight приложении. Для этого установим аттрибут ScriptableType у типа Page в файле Page.xaml.cs.
[ScriptableType]
public partial class Page : UserControl
Это позволит нам обращаться к специально отмеченным функциям данного обекта из JavaScript. Но сначала нам надо зарегистрировать объект класса Page как доступный для вызова. Для этого в конструктор Page() добавим следующий код:
HtmlPage.RegisterScriptableObject("silverlightApplication", this);
Здесь мы задали имя ("silverlightApplication") по которому мы сможем из JavaScript обращаться к .NET объекту.
Теперь внутри класса Page нам надо создать функцию, которую мы и будем вызывать из JavaScript. Вот код этой функции. Она имеет аттрибут ScriptableMember, что говорит о возможности её вызова из скриптов.
[ScriptableMember]
public void ChangeButtonContent(string text)
{
mainButton.Content = text;
}
Данная функция устанавливает текст у кнопки на Silverlight странице.
Далее представлен полный код класса Page:
[ScriptableType]
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
HtmlPage.RegisterScriptableObject("silverlightApplication", this);
HtmlDocument doc = HtmlPage.Document;
HtmlElement div = doc.GetElementById("myDIV");
div.AttachEvent("onclick", new EventHandler((o, x) =>
{
div.SetStyleAttribute("background", "yellow");
}));
}
private void Button_Click(object sender, RoutedEventArgs e)
{
HtmlDocument doc = HtmlPage.Document;
HtmlElement div = doc.GetElementById("myDIV");
div.SetStyleAttribute("background", "green");
HtmlPage.Window.Invoke("DisplayMessage", "Привет из Silverlight!");
}
[ScriptableMember]
public void ChangeButtonContent(string text)
{
mainButton.Content = text;
}
}
И файла Page.xaml:
<UserControl x:Class="MySilverlightApplication.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<Button Click="Button_Click" Content="Изменить цвет" Width="250" Height="50" x:Name="mainButton"/>
</Grid>
</UserControl>
Теперь изменим JavaScript функцию DisplayMessage так, чтобы она вызывала C# функцию ChangeButtonContent.
function DisplayMessage(message) {
alert(message);
silverLightControl = document.getElementById("Xaml1");
silverLightControl.content.silverlightApplication.ChangeButtonContent(message);
}
Мы получаем объект Silverlight плагина и вызываем функцию ChangeButtonContent, передавая ей тот же самый параметр, что мы передавали из C# кода в функцию DisplayMessage.
Полный код страницы MySilverlightApplicationTestPage.aspx находится ниже:
<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Register Assembly="System.Web.Silverlight" Namespace="System.Web.UI.SilverlightControls"
TagPrefix="asp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" style="height:100%;">
<head runat="server">
<title>MySilverlightApplication</title>
<script type="text/javascript">
function DisplayMessage(message) {
alert(message);
silverLightControl = document.getElementById("Xaml1");
silverLightControl.content.silverlightApplication.ChangeButtonContent(message);
}
</script>
</head>
<body style="height:100%;margin:0;">
<form id="form1" runat="server" style="height:100%;">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<div id="myDIV" style="background:blue;width:100%;height:100%">
<asp:Silverlight ID="Xaml1" runat="server"
Source="~/ClientBin/MySilverlightApplication.xap"
MinimumVersion="2.0.31005.0" Width="50%" Height="100%"
InitParameters="startPage=Page"/>
</div>
</form>
</body>
</html>
Запустите приложение и проверьте его работоспособность.
При нажатии на кнопку в Silverlight приложении меняется цвет фона у элемента div на HTML странице, а также происходит вызов JavaScript функции DisplayMessage, которая отображает сообщение. Данная JavaScript функция вызывает C# функцию ChangeButtonContent в классе Page. Функция ChangeButtonContent меняет текст на кнопке.