This walkthrough describes how to use the ASP.NET server controls for Silverlight to display a Silverlight 2 application in an ASP.NET AJAX Web page. In addition, this walkthrough describes how to provide client-side interactivity by using the Silverlight managed-code APIs. You will create a Silverlight application that has a linked Web site application, incorporate a XAML file and media files, and incorporate code that defines mouse events, plays sounds and displays animation.
Extensible Application Markup Language (XAML) simplifies creating a UI for the .NET Framework programming model. You can create visible UI elements in the declarative XAML markup, and then control these UI elements programmatically.
See a run-time code example of this feature: Run. See a video that shows this feature: Watch.
In order to complete this walkthrough, you will need:
To start, you will create a Silverlight application in Visual Studio 2008. When you create the Silverlight application, you can also create a Web site to host the Silverlight application.
To create a new Silverlight application in Visual Studio
The New Project dialog box appears.
The Add Silverlight Application dialog box appears.
When you create the Silverlight application, Visual Studio creates the following projects in the solution:
The two projects are linked by a Silverlight link. Each time that you build the Silverlight project, a compiled MyPianoV2.xap file is generated and added or updated under the ClientBin folder of the linked Web site. Additionally, Visual Studio adds a file that is named MyPianoV2TestPage.aspx to the Web site project that you will use to test the Silverlight application.
By default, the Silverlight Application includes a XAML file name Page.xaml. You will modify this file by adding specific XAML content to the Page.xaml file. This file will be incorporated into the MyPianoV2.xap file and displayed by the Silverlight control in the browser. The XAML content references specific images. The following procedure describes how to add XAML content and images to the Silverlight application.
To add XAML and image content to the Silverlight application
XAML
<UserControl x:Class="MyPianoV2.Page"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<Canvas x:Name="keys" RenderTransformOrigin="0,0">
<Image Source="Images/bg.jpg" Height="500" Width="1024"/>
<Image x:Name="imgC" Height="500" Width="1024" Canvas.Top="0" Source="Images/C.jpg" Opacity="0"/>
<Image x:Name="imgC2" Height="500" Width="1024" Canvas.Top="0" Source="Images/C2.jpg" Opacity="0"/>
<Image x:Name="imgD" Height="500" Width="1024" Canvas.Top="0" Source="Images/D.jpg" Opacity="0"/>
<Image x:Name="imgD2" Height="500" Width="1024" Canvas.Top="0" Source="Images/D2.jpg" Opacity="0"/>
<Image x:Name="imgE" Height="500" Width="1024" Canvas.Top="0" Source="Images/E.jpg" Opacity="0"/>
<Image x:Name="imgF" Height="500" Width="1024" Canvas.Top="0" Source="Images/F.jpg" Opacity="0"/>
<Image x:Name="imgF2" Height="500" Width="1024" Canvas.Top="0" Source="Images/F2.jpg" Opacity="0"/>
<Image x:Name="imgG" Height="500" Width="1024" Canvas.Top="0" Source="Images/G.jpg" Opacity="0"/>
<Image x:Name="imgG2" Height="500" Width="1024" Canvas.Top="0" Source="Images/G2.jpg" Opacity="0"/>
<Image x:Name="imgA" Height="500" Width="1024" Canvas.Top="0" Source="Images/A.jpg" Opacity="0"/>
<Image x:Name="imgA2" Height="500" Width="1024" Canvas.Top="0" Source="Images/A2.jpg" Opacity="0"/>
<Image x:Name="imgB" Height="500" Width="1024" Canvas.Top="0" Source="Images/B.jpg" Opacity="0"/>
<Path x:Name="CPath" Opacity="0.01" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Width="161.666656494141" Height="272.333312988281" Canvas.Left="135.5" Canvas.Top="138.83332824707" Data="M272.66667,140 L136,330 147.33333,336 162.66667,410.66667 247.33333,410 234.66667,330.66667 278,248 254,242.66667 258.66667,200.66667 296.66667,139.33333 272.66667,140" />
<Path x:Name="C2Path" Opacity="0.01" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Width="91" Height="136.333319306374" Canvas.Left="263.5" Canvas.Top="105.500005066396" Data="M325.33333,106.66667 L264,202.66667 266,241.33333 307.33333,238.66667 354,138 351.33333,106.66666 326.66667,106" />
<Path x:Name="DPath" Opacity="0.01" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Width="131" Height="274.333297729492" Canvas.Left="247.499999999999" Canvas.Top="137.499984741212" Data="M358,142.66667 L311.33333,243.33333 288.66667,246 248,330.66667 258,338 266.66667,411.33333 354,410.66665 347.33333,330.66668 374,246.66668 350,243.33336 352.66667,202.66669 378,138.00005 360.66667,140.00005" />
<Path x:Name="D2Path" Opacity="0.01" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Width="70.3333129882813" Height="134.333319425583" Canvas.Left="356.83334350586" Canvas.Top="107.500003457069" Data="M394.66667,108.66667 L357.33333,204 359.33333,241.33333 398,240.66667 426.66667,134.66667 425.33333,108"/>
<Path x:Name="EPath" Opacity="0.01" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Width="117.666656494141" Height="274.333343505859" Canvas.Left="358.833343505859" Canvas.Top="137.5" Data="M431.33333,140 L403.33333,245.33333 381.33333,248 359.33333,330 368.66667,339.33333 372,411.33333 458,411.33333 455.33333,331.33333 476,138 433.33333,138.66667"/>
<Path x:Name="FPath" Opacity="0.01" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Width="99.6666564941406" Height="273.666680037975" Canvas.Left="470.83334350586" Canvas.Top="138.833345949649" Data="M486.66667,140.66667 L471.33333,332 477.33333,334 476.66667,412 563.33333,411.33335 564,339.33334 570,328 560,246.66665 535.33333,243.33331 530,139.3333 486.66667,139.33329" />
<Path x:Name="F2Path" Opacity="0.01" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Width="51" Height="133.666656494141" Canvas.Left="534.166687011719" Canvas.Top="108.16665649414" Data="M538.66667,109.33333 L534.66667,137.33333 542,241.33333 584,240.66666 584.66667,205.33334 568,108.66667 540.66667,108.66668" />
<Path x:Name="GPath" Opacity="0.01" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Width="111" Height="274.333343505859" Canvas.Left="570.166687011719" Canvas.Top="137.5" Data="M570.66667,248 L582.66667,336 582,411.33333 669.33333,410.66667 672.66667,332.66667 680.66667,330 655.33333,245.33333 631.33333,244 601.33333,138 578.66667,138 594.66667,244.66667 571.33333,248" />
<Path x:Name="G2Path" Opacity="0.01" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Width="76.3333129882813" Height="131.666656494141" Canvas.Left="603.5" Canvas.Top="110.166664123534" Data="M612,111.33333 L604,136.66667 636,238.66667 636.66667,241.33333 679.33333,241.33333 679.33333,206.66667 641.33333,111.33334 612.66667,110.66668" />
<Path x:Name="APath" Opacity="0.01" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Width="138.333312988281" Height="274.333343505859" Canvas.Left="655.5" Canvas.Top="137.5" Data="M665.33333,246 L694.66667,336.66667 686,411.33333 774.66667,410 785.33333,335.33333 793.33333,328.66667 750.66667,246.66667 722,243.33333 673.33333,138 656,138.66667 688.66667,216.66667 685.33333,245.33333 666,246" />
<Path x:Name="A2Path" Opacity="0.01" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Width="95" Height="131" Canvas.Left="676.166687011719" Canvas.Top="110.833320617675" Data="M682,111.33333 L676.66667,138.66667 730.66667,240.66667 768.66667,241.33333 770.66667,204.00001 713.33333,111.33334 683.33333,111.33335" />
<Path x:Name="BPath" Opacity="0.01" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Width="172.333312988281" Height="275.666687011719" Canvas.Left="733.5" Canvas.Top="136.833320051431" Data="M758,247.33333 L806,333.33333 790,412 878,412 894.66667,334 905.33333,327.33333 764.66667,138.66667 734,137.33333 776.66667,207.33334 778.66667,246.66668 758.66667,248" />
<MediaElement x:Name="C" AutoPlay="false" Source="Media/C.wma"/>
<MediaElement x:Name="C2" AutoPlay="false" Source="Media/C2.wma"/>
<MediaElement x:Name="D" AutoPlay="false" Source="Media/D.wma"/>
<MediaElement x:Name="D2" AutoPlay="false" Source="Media/D2.wma"/>
<MediaElement x:Name="E" AutoPlay="false" Source="Media/E.wma"/>
<MediaElement x:Name="F" AutoPlay="false" Source="Media/F.wma"/>
<MediaElement x:Name="F2" AutoPlay="false" Source="Media/F2.wma"/>
<MediaElement x:Name="G" AutoPlay="false" Source="Media/G.wma"/>
<MediaElement x:Name="G2" AutoPlay="false" Source="Media/G2.wma"/>
<MediaElement x:Name="A" AutoPlay="false" Source="Media/A.wma"/>
<MediaElement x:Name="A2" AutoPlay="false" Source="Media/A2.wma"/>
<MediaElement x:Name="B" AutoPlay="false" Source="Media/B.wma"/>
</Canvas>
</Grid>
</UserControl>
Note:
No images will be displayed until you add them to the project later in this walkthrough.
The compressed (.zip) file contains an Images folder and a Media folder. The files in the Media folder will be used later in this walkthrough.
The Images folder displays the available graphics files.
The Image elements of the XAML in the Page.xaml file correspond to keys of a piano. The Path elements will be used to associate mouse events with each piano key. The MediaElement elements will be used to play the appropriate media content.
The next step is to add the sound files that are referenced by the MediaElement element in the XAML.
To add media content
The Media folder displays the available media files.
Marking the media files as resources enables these files to be included in the .xap file. The XAML you added earlier will be used to play the media files.
In this section, you will add interactivity by adding mouse event handlers for the piano keys. Additionally, you will add code to play the notes.
To add interactivity by using managed code
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace MyPianoV2
{
public partial class Page : UserControl
// Fields
private string[] keyNames = new string[] { "CPath", "C2Path", "DPath", "D2Path", "EPath", "FPath", "F2Path",
"GPath", "G2Path", "APath", "A2Path", "BPath" };
private static Canvas keysCanvas;
public Page()
InitializeComponent();
keysCanvas = keys;
for (int i = 0; i < this.keyNames.Length; i++)
Path path = (Path)keys.FindName(this.keyNames[i]);
path.MouseLeftButtonDown += new MouseButtonEventHandler(this.noteDown);
path.MouseLeftButtonUp += new MouseButtonEventHandler(this.noteUp);
}
private void noteDown(object sender, MouseButtonEventArgs e)
((UIElement)sender).CaptureMouse();
string pathName = ((Path)sender).Name;
string noteName = pathName.Substring(0, pathName.IndexOf("Path"));
Image image = (Image)keysCanvas.FindName("img" + noteName);
image.Opacity = 1;
MediaElement mediaElement = (MediaElement)keysCanvas.FindName(noteName);
mediaElement.Play();
private void noteUp(object sender, MouseButtonEventArgs e)
((UIElement)sender).ReleaseMouseCapture();
image.Opacity = 0;
mediaElement.Stop();
Visual Basic
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Documents
Imports System.Windows.Input
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Shapes
Partial Public Class Page
Inherits UserControl
' Fields
Private keyNames() As String = {"CPath", "C2Path", "DPath", "D2Path", "EPath", "FPath", "F2Path", "GPath", "G2Path", "APath", "A2Path", "BPath"}
Private Shared keysCanvas As Canvas
Public Sub New()
InitializeComponent()
keysCanvas = keys
Dim i As Integer
For i = 0 To (Me.keyNames.Length) - 1
Dim path As Path = DirectCast(keys.FindName(Me.keyNames(i)), Path)
AddHandler path.MouseLeftButtonDown, AddressOf Me.noteDown
AddHandler path.MouseLeftButtonUp, AddressOf Me.noteUp
Next i
End Sub
Private Sub noteDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
CType(sender, UIElement).CaptureMouse()
Dim pathName As String = CType(sender, Path).Name
Dim noteName As String = pathName.Substring(0, pathName.IndexOf("Path"))
Dim image As Image = CType(keysCanvas.FindName(("img" + noteName)), Image)
image.Opacity = 1
Dim mediaElement As MediaElement = CType(keysCanvas.FindName(noteName), MediaElement)
mediaElement.Play()
End Sub 'noteDown
Private Sub noteUp(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
CType(sender, UIElement).ReleaseMouseCapture()
image.Opacity = 0
mediaElement.Stop()
End Sub 'noteUp
End Class 'Page
The noteDown handler of the Page class plays individual notes when you click them. The noteUp handler stops a note from playing when you release the mouse button.
In order for the piano keys to play, sound must be correctly configured on your computer.
There are two projects that are created in this walkthrough. The first project is the Silverlight Application project (MyPianoV2) containing XAML and managed code. The second project is the Web site project (MyPianoV2.Web) that is linked to the Silverlight Application project. The following code shows an .aspx page from the Web site project (MyPianoV2Web). This page shows how to include the Silverlight server control in the Web page. The Source attribute of the Silverlight server control references the .xap application package.
<%@ 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>ASP.NET Controls for Silverlight - Silverlight 2.0 Example</title>
</head>
<body style="height:100%;margin:0;">
<form id="form1" runat="server" style="height:100%;">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<div style="height:100%;">
<asp:Silverlight ID="Xaml1" runat="server" Source="../ClientBin/MyPianoV2.xap" MinimumVersion="2.0.31005.0" Width="1024px" Height="500px" />
</div>
</form>
</body>
</html>
<%@ Page Language="VB" AutoEventWireup="true" %>
ASP.NET Controls for Silverlight
XAML Overview
We look forward to your comments and feedback.
-- Erik ReitanASP.NET User EducationThis posting is provided "AS IS" with no warranties, and confers no rights.