Thursday, July 18, 2013

SilverLight

What is Silverlight?

Silverlight is a powerful cross-browser & cross-platform technology for building the next generation web experience & rich internet applications for the web. You can run Silverlight in most of all the popular browsers like Internet Explorer, Firefox, Chrome, Safari etc. Silverlight can run in various devices and operating systems like Windows, Apple Mac OS-X and Windows Phone 7. Using Silverlight you can create rich, visually stunning web applications like flash. Also you can create smooth animations using Storyboards; you can stream media over the net etc.
Silverlight web browser plug-in comes as free to install (approximately 4-5 MB in size). You can download the required plug-in from Microsoft Silverlight Site.


What are the System Requirements for installing Silverlight?

 
MINIMUM SYSTEM REQUIREMENTS FOR INSTALLING SILVERLIGHT PLUG-IN IS AS FOLLOWS:

PC Type
Processor
RAM
Operating System
Windows PC
500 MHz or higher, x86 or x64 bit processor
128 MB
Windows XP SP2+
Mac Power PC
PowerPC G4 800 MHz or higher
128 MB
Mac 10.4.8 or higher
Mac Intel-based
Intel Core Duo 1.83 GHz or higher
128 MB
Mac 10.4.8 or higher
Silverlight also supports Linux PCs. The plug-in name for Linux operating system is Moonlight and you can get the information about it in Mono Project's Moonlight site (http://www.mono-project.com/Moonlight).
MINIMUM SYSTEM REQUIREMENTS FOR INSTALLING SILVERLIGHT SDK FOR DEVELOPMENT IS AS FOLLOWS:
If you are a developer and want to start working on it, you must need the following environment to install the Silverlight tools.
Operating System
-     Microsoft Windows XP Service Pack 2 or higher
Developer Tools
-         Visual Studio 2008 SP1 (for Silverlight 3)
-         Visual Studio 2010 (for Silverlight 3 & Silverlight 4)
Designers Tools
-         Microsoft Expression Blend 3 (for Silverlight 3)
-         Microsoft Expression Blend 4 (for Silverlight 3 & Silverlight 4)
Silverlight SDK
-         Silverlight 3 Tools for Visual Studio 2008 SP1
-         Silverlight 4 Tools for Visual Studio 2010

How can I know whether Silverlight is installed in my PC?

If you are not sure whether Silverlight is already installed in your PC, just go to the Microsoft Silverlight Installation Page (http://www.microsoft.com/getsilverlight/get-started/install/) and that will tell you whether the plug-in is already installed or you need to install.


What are the Prerequisite to create a new Silverlight Application?
Before starting with the Silverlight application development be sure you have all the necessary softwares installed in your PC. If you don’t have then follow the steps mentioned in Microsoft Silverlight Site (http://silverlight.net/getstarted/) to download & install the following items in your development environment:
  • Visual Studio 2008 SP1 for Silverlight 3 application development or Visual Studio 2010 for Silverlight 3 & Silverlight 4 application development
  • Silverlight 3 Tools for Visual Studio 2008 SP1 or Silverlight 4 Tools for Visual Studio 2010
  • Expression Blend 3 for Silverlight 3 or Expression Blend 4 Preview for Silverlight 4 (optional)
  • WCF RIA Services for Silverlight (optional)
  • Silverlight 3 Toolkit or Silverlight 4 Toolkit based on your earlier version of Silverlight (optional)
Remember that, Silverlight 3 comes preinstalled with Visual Studio 2010 and hence if you are using Visual Studio 2010, you don’t need to install the Silverlight 3 Tools for it. Using Visual Studio 2010 you can develop both Silverlight 3 and Silverlight 4 applications but Visual Studio 2008 SP1 only supports Silverlight 3.
If you have proper development environment ready for Silverlight application you can proceed to the next chapter for creating our first simple Silverlight project. I am using Visual Studio 2010 RC and Silverlight 4 RC while writing these applications. Hence, the attached samples will not open in Visual Studio 2008.


What is XAML?

XAML stands for eXtended Application Markup Language. It is nothing but an XML file which is used to declaratively create the User Interface of the Silverlight or WPF applications. This XAML file generally rendered by the Silverlight plugin and displayed inside the browser window. When you compile your projects which includes XAML pages, those first converts into BAML (Binary Application Markup Language) and then rendered in the web browser window. Let use see a simple example of XAML here:
<TextBlock x:Name="txbTitle" Text="Hello Silverlight" FontFamily="Comic Sans MS" FontWeight="Bold"/>
The above XAML is a typical example where I am creating a text using the TextBlock control by specifying different properties as attributes to the control for name, font-family, weight, text etc.


What is App.xaml file?

App.xaml file is the loader of your Silverlight Application. You can declare your shared/global resources, styles, templates, different brushes inside this file which will be accessible by your application.
A typical App.xaml file looks like:
<Application 

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

x:Class="SilverlightApps.HelloSilverlight.App">

<Application.Resources>
<!-- Brush -->
<SolidColorBrush x:Name="solidBrushRed" Color="Red"/>
<SolidColorBrush x:Name="solidBrushGreen" Color="Green"/>
<SolidColorBrush x:Name="solidBrushBlue" Color="Blue"/>
<!-- Styles -->
<Style x:Key="styleButton" TargetType="Button">
<Setter Property="Background" Value="Yellow"/>
</Style>
</Application.Resources>
</Application>
It has a code behind file too named as “App.xaml.cs”. This file is used to handle global application level events which you can use as per your need. Visual Studio creates these two files at the time of project creation. The three events inside the App.xaml.cs are:
  • Application_Startup
  • Application_Exit
  • Application_UnhandledException.
These three events are registered in the constructor of your App.xaml.cs file. Here is the code snippet of the same:

public partial class App : Application

{
public App()
{
this.Startup += this.Application_Startup;
this.Exit += this.Application_Exit;
this.UnhandledException += this.Application_UnhandledException;
InitializeComponent();
}private void Application_Startup(object sender, StartupEventArgs e)
{
this.RootVisual = newMainPage();
}private void Application_Exit(object sender, EventArgs e)
{ }private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
if (!System.Diagnostics.Debugger.IsAttached)
{e.Handled = true;
Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
}
}private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
{
try
{
string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");
System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
}catch (Exception)
{ }
}
}

Let us do a brief discussion on each part of the code file.
Overview of App Constructor:
Inside the constructor of the App class you will find that all the three event has been registered. Also, there is a call to InitializeComponent() method. If you look around the whole class you will not find the method implementation. Strange!!! Where is the method?
The method has been implemented inside the partial class of the App class. If you go to the definition or just press F12 on top of the method, Visual Studio will open up the actual file named “App.g.i.cs” which contains the partial implementation of the same class. There you will find the method implementation.
What this method does: This method is responsible to load the XAML using the LoadComponent() method into the memory which can be used by your application.
What can we do inside the App.g.i.cs file: App.g.i.cs file is auto generated by the compiler and hence if you modify something there will be overwritten by the compiler itself on next build.
Why this file is not available inside my solution: As this is an compiler generated file, it has been placed inside the temporary directory named “obj”. If you go to the solution directory you will see the “obj” folder. Open it and browse through it’s subfolder (either debug or release) and you will see the file placed there. If you are unable to find it there, just do a rebuild of your solution and immediately it will be created there.
Overview of Application_Startup Event:
Application_Startup event is the root of your application. In this event you can create the instance of your initial page and set it as the RootVisual. Also, if you want to create some global objects or want to write some app initialization code, then this Application_Startup event will be the best part for you to implement it.
Overview of Application_Exit Event:
Similarly, you can write code to cleanup objects or do something when closing the application inside the Application_Exit event.
Overview of Application_UnhandledException Event:
If any exception comes while running and you didn’t handle that in the actual place, you can write some code in Application_UnhandledException to log the error details into database or show some message to the user. This will allow the application to continue running after an exception has been thrown. By default, if the app is running outside of the debugger then report the exception using the Browser DOM & the error will be visible in the status bar of Internet Explorer.


What is MainPage.xaml file?

When you create the Silverlight project, Visual Studio IDE will automatically add a default “MainPage.xaml” file which is actually a startpage for your Silverlight application. You can modify this page as per your need or can create a new one. So, what’s there inside the file? Lets look at it:
<UserControl x:Class="SilverlightApps.HelloSilverlight.MainPage"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

mc:Ignorable="d"

d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White">
</Grid>
</UserControl>
Lets walk-through each lines of the code. It contains an UserControl as root of the file which may contain all other controls inside it. The following line tells the compiler to use the specified class to use:
x:Class="SilverlightApps.HelloSilverlight.MainPage"
The next couple of lines beginning with xmlns tells the compiler to import some namespaces which can be used by the Silverlight XAML page.
The following line speaks about the design time Height & Width of the Silverlight page:
d:DesignHeight="300" d:DesignWidth="400"
If you want to specify actual Height & Width of your Silverlight application, you can manually append the following line inside that:
Height="300" Width="400"
Next comes the Grid control which is used as a layout panel and that can include more other controls. Though the default XAML file uses the Grid as the layout panel, you can change it to any other panel as per your need. I will discuss about the various panel later in this tutorial.
<Grid x:Name="LayoutRoot" Background="White">

</Grid>
“MainPage.xaml” has also it’s code behind file like App.xaml & you can use this to write code to develop your functionalities. By default, it comes empty with a call to Initialize() method inside the Constructor of the MainPage class. The implementation of this method is also available in a different partial class of MainPage inside “MainPage.g.i.cs” like “App” class. Whenever you add some controls inside the XAML page, it will be loaded here.


What is XAP file?

XAP (pronounced as ZAP) is the compressed output of the Silverlight Application which includes application manifest file, compiled output assembly and other resources used by your silverlight application. This uses the normal ZIP compression method to reduce the total download size. When you build your Silverlight application, it actually generates this .XAP file & puts in the output folder which the .aspx page refers as source to load the application.
Once you build your project, it will create the XAP file (in our case, it is: SilverlightApps.HelloSilverlight.xap) and put it into the ClientBin directory of the web project. When the page loads it will pickup from the same location as the source you specified inside the aspx/html page.

How can I host a Silverlight Application?

When you create a Silverlight project, it asks you to create a Web Application project. This project is responsible for hosting your XAP file. Generally Silverlight application doesn’t require any server to host it to run, but if you are planning to host it in web you must need a web server for that.
Once you publish your Web Application to host in IIS, you may need to add three MIME types in your IIS Server. This is require to host it in earlier versions of IIS. Latest version of IIS comes with that configuration by default. Followings are the list of MIME Types those you need to add in your IIS Properties:
  • .xap       application/x-silverlight-app
  • .xaml      application/xaml+xml
  • .xbap     application/x-ms-xbap
Silverlight Application (XAP) generally loads inside the ASPX or HTML pages pointing to the path to load the XAP. The aspx/html page uses <object /> tag to load the Silverlight application.
Here is the code present inside the aspx/html pages for loading the Silverlight XAP:
<object data="data:application/x-silverlight-2," 

type="application/x-silverlight-2" width="100%" height="100%">
<paramname="source" value="ClientBin/SilverlightApps.HelloSilverlight.xap"/>
<paramname="onError" value="onSilverlightError" />
<paramname="background" value="white" />
<paramname="minRuntimeVersion" value="4.0.50222.0" />
<paramname="autoUpgrade" value="true" />
<a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50222.0"
style="text-decoration:none">
<imgsrc="http://go.microsoft.com/fwlink/?LinkId=161376"
alt="Get Microsoft Silverlight" style="border-style:none"/>
</a>
</object>
Let us go line by line to learn the basics of it.
  • In the first line <object> tag tells the browser to load the Silverlight plug-in.
  • Next couple of lines uses <param> tag.
    • The first param “source” has the value to the location of the .xap file.
    • Second param “onError” tells the plug-in to call the javascript method mentioned in the value, if any application error occurs.
    • The third param “background” specifies the color of the Silverlight application background.
    • The next param “minRuntimeVersion” specifies the minimum required plug-in version to load your Silverlight application.
    • If “autoUpgrade” is set as true in the next param, it will automatically upgrade the runtime.
  • The next lines are very interesting. Whatever you design there, will not be visible in the browser in normal scenarios. If the user doesn’t have Silverlight runtime installed in his PC or the Silverlight plug-in is disabled this section will visible to the user. This part is well known as “Silverlight Installation Experience panel”. By default, it shows a Silverlight image to download the runtime from Microsoft site. When the user clicks on it, this starts the installation. I will discuss about the Silverlight Experience later in depth. 

How to create a new Silverlight Project?

If your development environment is ready then we can proceed towards creating a new Silverlight Application project. At the end of this part we will be able to run our first Silverlight application inside the browser.
1. Open your Visual Studio 2010 IDE
2. Select File > New Project or just press CTRL + SHIFT + N to open up the New Project dialog
3. Expand the “Visual C#” node and then go to sub node “Silverlight”
4. Select “Silverlight Application” in the right pane

Create new project
Figure 1: Visual Studio Project Types

5. Select proper location to store your application (let’s say, “D:\Sample Apps\”
6. Now enter a proper name for your project (call it as: SilverlightApps.HelloSilverlight)
7. Select the .Net Framework version from the combo box at the top (I am using .Net Framework 4.0 by default as I am using Visual Studio 2010) and click OK
8. In the next dialog make sure that “Host the Silverlight application in a new Web site” option is selected

create new silverlight application
Figure 2: Silverlight Hosting Application

9. Choose “Silverlight 4” as the Silverlight Version and hit OK

Wait for a while, Visual Studio will now create the first Silverlight solution for you to use which will contain a Silverlight Project and one Web Application Project to host your Silverlight application. Once done, you will see Visual Studio already created two XAML files (App.xaml & MainPage.xaml) for you inside the Silverlight Application project.
So for now your first Silverlight application has been created. Press F5 to run the application. It will open a browser Window with a blank page on that. Wow! What happened? Nothing is there!!! Don’t worry, everything is fine. We didn’t modify the default blank XAML page. Just right click on the browser page & you will see the Silverlight context menu on that.

first silverlight page
Figure 3: Silverlight inside the Browser


What’s the Project Structure of Silverlight?


When you create a new Silverlight project, Visual Studio IDE creates two different projects for you (as you can see in the below picture). One is your main Silverlight project and the another is a Web application project which will host your Silverlight application (.xap file).

Silverlight project structure
Figure 4: Silverlight Project Structure

The main Silverlight project (SilverlightApps.HelloSilverlight) consists of App.xaml, App.xaml.cs, MainPage.xaml & MainPage.xaml.cs. I already discussed on those file in depth in previous chapter. The web project (SilverlightApps.HelloSilverlight.Web) consists of JavaScript file named Silverlight.js which is responsible for checking the Silverlight version in client side and also if the Silverlight plug-in is missing at the user end, it asks to install the required runtime from Microsoft site. The .aspx & .html pages are present in the root to host the Silverlight application. Your Silverlight application .xap file is located under the ClientBin directory inside the Web project.


Creating a “HelloSilverlight” Application


Now let us start modifying the “MainPage.xaml” by insertinga text “Hello Silverlight”. We will add one TextBlock control inside the Grid panel with it’s text property as “Hello Silverlight”.
But before going to add the content inside your page let me tell you that, you can add it in two ways: “Declarative approach in XAML” and “Programmatic approach in Code-Behind”. In declarative approach you have to add the Silverlight controls in the XAML page in XML format only with their properties as attributes. In other hand, you have to create the objects of the controls programmatically and have to set their properties.
First go with the Declarative Approach:

1. Open the file “MainPage.xaml” in Visual Studio
2. Inside the Grid tag add the following texts:
<TextBlock x:Name="txtTitle" Text="Hello Silverlight From XAML" FontSize="32" Foreground="Red" HorizontalAlignment="Center"/> 
Your XAML page will now look like this:
<UserControl x:Class="SilverlightApps.HelloSilverlight.MainPage"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

mc:Ignorable="d"

d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White">
<TextBlock x:Name="txtTitle" Text="Hello Silverlight From XAML"
FontSize="32" Foreground="Red" HorizontalAlignment="Center"/>
</Grid>
</UserControl>
3. Press F5 to run your application once again. Once the browser loads your Silverlight application you will see “Hello SilverlightFrom XAML” text appears inside the browser window.

First silverlight application
Figure 5: Hello Silverlight from XAML in Browser

Now, we will create the same from the code behind (programmatically). Assume that, we have not added the Text inside the XAML.
1. Open your “MainPage.xaml.cs” using the Visual Studio
2. There you will find the constructor of the MainPage class. Add the following lines of code after the call to the InitializeComponent() method:

// Create the instance of the textblock and set it's propertiesTextBlock txtTitle = new TextBlock

{
Name = "txtTitle",
Text = "Hello Silverlight From Code",
FontSize = 32.0,Foreground = new SolidColorBrush(Colors.Red),
HorizontalAlignment = HorizontalAlignment.Center
};
// Add the textblock instance as the children of the "LayoutRoot" LayoutRoot.Children.Add(txtTitle);

Let’s describe it in depth. First of all we are creating the instance of the TextBlock control and setting the Name, Text, FontSize, Foreground color etc. at the time of initialization. Then once the control is ready, we are adding it to the main panel i.e. the Grid layout panel inside the XAML named “LayoutRoot”.
After adding this your code will look like below:
using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

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 SilverlightApps.HelloSilverlight

{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();// Create the instance of the textblock and set it's properties
TextBlock txtTitle = new TextBlock
{
Name = "txtTitle",
Text = "Hello Silverlight From Code",
FontSize = 32.0,Foreground = new SolidColorBrush(Colors.Red),
HorizontalAlignment = HorizontalAlignment.Center
};// Add the textblock instance as the children of the "LayoutRoot"
LayoutRoot.Children.Add(txtTitle);
}
}
}

3. Press F5 to run your application. You will now see your browser window opens with a text “Hello Silverlight From Code” inside it.

Hello Silverlight from Code in Browser
Figure 6: Hello Silverlight from Code in Browser

Note that, the TextBlock control has been added as a child element to the LayoutRoot panel which is a Grid. So, the question here is, what are the panels available in Silverlight where we can add child controls? Ok, for now just remember that there are several content holders (panels) available to hold any child controls like: Grid, Canvas, Border, StackPanel etc. In XAML pages the elements are maintained in a hierarchy like the HTML pages (DOM i.e. Document Object Model). This hierarchy allows us to nest different controls inside each other. I will discuss on this in depth in the next chapter.


Creating a Silverlight UserControl


In our last example we have seen, once we created the Silverlight project, the Visual Studio IDE has automatically created two XAML pages: App.xaml&MainPage.xaml. If you view the MainPage.xaml in depth, you will notice that it started with “UserControl” as the root element.
<UserControl x:Class="SilverlightApps.HelloSilverlight.MainPage"

. . . >

</UserControl>
Also, if you open the MainPage.xaml.cs file you will notice that the class itself inherits from the base class “UserControl”.
namespace SilverlightApps.HelloSilverlight

{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
}
}

So, what is that UserControl? UserControls are basic unit of reusable XAML like you use in asp.net. It is the root of your XAML and contain only one child as a control. Though that child may contain one or more other controls but the UserControl must have a maximum of one content control. UserControls are mainly created using XAML and then reused in various places.
How can I create a simple new Silverlight UserControl? Is it difficult to implement? Ummm… I will not tell you. Let us create a simple UserControl then. You will tell me whether it is difficult or simple.


Silverlight Tools for Visual Studio comes up with the default template for creating a basic UserControl. Now follow the steps to create it:
  1. Open your existing Silverlight application project (for this example, you can use the “HelloSilverlight” project just now we created)
  2. Right click on the Silverlight project “SilverlightApps.HelloSilverlight” and select Add -> New Item
  3. Select “Silverlight UserControl” from the right panel
  4. Enter a good name (here I am using “EmployeeView”) and hit enter

Silverlight UserControl Creation
Figure 7: Silverlight UserControl Creation

This will create the UserControl named “EmployeeView” with the default template layout and open up the XAML page in the IDE. If you look into the XAML code you will notice the following code:

<UserControl x:Class="SilverlightApps.HelloSilverlight.EmployeeView"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

mc:Ignorable="d"

d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White">
</Grid>
</UserControl>
We already discussed about each of the lines in the previous chapter (in “What is MainPage.xaml file” section). So, I will not cover it again. Now let us build our first UserControl to show the Employee’s FirstName, LastName& Department inside the UserControl XAML file. How to do that? Before doing it let us split our Grid panel into three Rows & two Columns (will discuss on this in next chapter):

<Grid x:Name="LayoutRoot" Background="White">

<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
</Grid>
Now, lets add the TextBlocks inside the Grid, in specific Rows and Columns. In our case the left column will hold the “FirstName”, “LastName” and “Department” label. The second column will hold the informations according to the labels. Here is the XAML code for the same:

<UserControl x:Class="SilverlightApps.HelloSilverlight.EmployeeView"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

mc:Ignorable="d" Width="300">

<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="LabelFirstName" Text="FirstName" Grid.Row="0" Grid.Column="0"/>
<TextBlock x:Name="FirstName" Text="Kunal" Grid.Row="0" Grid.Column="1"/>
<TextBlock x:Name="LabelLastName" Text="LastName" Grid.Row="1" Grid.Column="0"/>
<TextBlock x:Name="LastName" Text="Chowdhury" Grid.Row="1" Grid.Column="1"/>
<TextBlock x:Name="LabelDepartment" Text="Department" Grid.Row="2" Grid.Column="0"/>
<TextBlock x:Name="Department" Text="Software Engineering" Grid.Row="2" Grid.Column="1"/>
</Grid>
</UserControl>
You can see, I am using “Grid.Row” and “Grid.Column” attributes in each TextBlock. What does it mean? Grid.Row specifies the row number where to place the control. Similarly, Grid.Column specifies the column number. For example, if you use Grid.Row=”2” and Grid.Column=”4” to any element inside your Grid, the element control will be placed in 3rd Row and 5th Column of the Grid. You can think the Grid panel as a Matrix which has zero based index.
Our UserControl is ready now, but before running the application we need to put it inside the MainPage which loads at application load. You can do this in two different ways. One is using the XAML and the another is using the Code-behind file. In code behind it is very easy. You have to follow the same steps as we did in previous chapter to set the “Hello Silverlight” TextBlock, but if you want to set it in XAML you have to do a little trick for the first time. Let us discuss on this step-by-step:

First go with the Declarative Approach:
1. Open the file “MainPage.xaml” in Visual Studio
2. Add the following line inside the UserControl tag of the MainPage.xaml (after any xmlns line):
xmlns:uc="clr-namespace:SilverlightApps.HelloSilverlight"
Now, your MainPage.xaml will look like this (the bolder text I have inserted in the XAML):
<UserControl x:Class="SilverlightApps.HelloSilverlight.MainPage"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:uc="clr-namespace:SilverlightApps.HelloSilverlight"

mc:Ignorable="d"

d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White">
</Grid>
</UserControl>
Here, “uc” stands for pre-tag for specifying the namespace. You can use any name. We used “uc” to specify “UserControl” for better readability. Now inside the Grid control you can add the UserControl we have just created. Here is the code for the same:

<Grid x:Name="LayoutRoot" Background="White">

<uc:EmployeeView Width="300" Height="60"/>

</Grid> 
Once you run your application now, you will see the following view of your first UserControl application:
First UserControl View
Figure 8: First UserControl View

Now let us create it from Code-behind. I assume that the control we just added inside the Grid has been removed from the XAML, that means your Grid panel has no child inside it. Create the instance of the EmployeeViewUserControl and add it as child to the LayoutRoot Grid:
// Create the instance of the EmployeeViewUserControlEmployeeView empView = new EmployeeView

{

Width = 300.0,
Height = 60.0,
};
// Add the EmployeeViewUserControl as the child of the default panel "LayoutRoot"LayoutRoot.Children.Add(empView);

Run your application and you will see the same output. The second approach is easy, am I right? Yup, for the first application it looks very easy enough. But when you write complex applications you will notice that the first approach is easier than the later. Why? Because, you will get more control over the design. You can see the output immediately in the preview sceen, also you can drag the control to position it properly in the panel. In some cases you will find it useful from code.  Depending upon your business need you have to decide where to create and add your UserControl.
Is it confusing? No, when you are sure that you have to dynamically load no. of UserControls based on your data you have to create and load it from the code behind. For the other cases, it will be easier to write inside the XAML.
Remember that, you can create as many instances of your UserControl and place it inside your XAML page. Once we discuss on the different types of panel and layout in next chapter you can get better visibility to that.

Overview of Panels

There are total six numbers of panels available in Silverlight. They are as below:
  1. Grid
  2. Canvas
  3. StackPanel
  4. ScrollViewer
  5. Border
  6. ViewBox
You will find Grid, Canvas, StackPanel and Border as most useful panel while you start working with them in your Silverlight application. Let us discuss about those in depth.

“Grid” Layout Panel

The Grid layout panel is the most useful panel you ever use. This is the default panel inserted inside every xaml when you create a UserControl. When we created our first Silverlight example or even the first UserControl, you noticed that there was a Grid panel named “LayoutRoot” where we created Rows and Column definitions to place our control to create the Employee View.
The Grid layout control allows you to define the Grid structure to place individual elements as Rows & Column structure in Matrix format. Once you divide your Grid panel in Rows and Columns you can place your element in the appropriate cell by using Grid.Row or Grid.Column property.

See the Grid structure in the below image:
Grid layout panel
Picture: Grid Layout Panel Structure

Now lets discuss about creating rows and columns, then place some rectangles in each cells. We will create three rows and three columns as described in the above image:
1. Create a UserControl named “GridPanelDemo” in our Silverlight Application.
2. Open the GridPanelDemo.xaml file. You will see that there is a Grid named “LayoutRoot” inside your UserControl.
3. Now enter the following XAML code between the Grid tags (<Grid>…</Grid>):
<Grid.RowDefinitions>

<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
4. This will divide your Grid in three rows and three columns of equal height and equal width.
5. You can also set height for Rows and widths for Columns by specifying the value to the properties like this:
<RowDefinition Height="100"/> 

and 

<ColumnDefinition Width="100"/>
6. You can specify the value for Height & Width in three different ways:
a. Pixel Value (like: “90”, means the height or width of 90 pixel)
b. Percentage Value (like: “5*”, means the height or width of 50% or “*”, means 100%)
c. Automatic Value (like: “Auto”, means the height or width of the Row or Column will resize automatically as  per the size of content of the respective Row or Column.
7. Now we will put some texts using TextBlock and will put them in appropriate cells of the Grid control. You can achieve this by using the Grid.Row=”ROW_NUMBER” and Grid.Column=”COLUMN_NUMBER” as the property of your TextBlock control. Modify your XAML to set this texts like this:
<Grid x:Name="LayoutRoot" Background="BlanchedAlmond">

<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="Row[0], Col[0]" Grid.Row="0" Grid.Column="0" />
<TextBlock Text="Row[0], Col[1]" Grid.Row="0" Grid.Column="1" />
<TextBlock Text="Row[0], Col[2]" Grid.Row="0" Grid.Column="2" />
<TextBlock Text="Row[1], Col[0]" Grid.Row="1" Grid.Column="0" />
<TextBlock Text="Row[1], Col[1]" Grid.Row="1" Grid.Column="1" />
<TextBlock Text="Row[1], Col[2]" Grid.Row="1" Grid.Column="2" />
<TextBlock Text="Row[2], Col[0]" Grid.Row="2" Grid.Column="0" />
<TextBlock Text="Row[2], Col[1]" Grid.Row="2" Grid.Column="1" />
<TextBlock Text="Row[2], Col[2]" Grid.Row="2" Grid.Column="2" />
</Grid>
8. Also, you can use Grid.RowSpan and Grid.ColumnSpan properties to span your rows and columns. If you are familiar with HTML table tag & properties you can easily understand it properly.
<TextBlock Text="Row[0], Col[0]" Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Grid.ColumnSpan="2" /> 
If we use the above code, it will span the 0th Row and 0th Column to two Rows & Columns. This is nothing but merging rows and columns of Grid Layout.
9. Now, open the MainPage.xaml.cs file & in the constructor create the instance of the GridPanelDemo usercontrol and add it as the child of the LayoutRoot i.e. Grid.
LayoutRoot.Children.Add(new GridPanelDemo());
10. Run your Silverlight application. You will see that, the TextBlocks are arranged in the Page in matrix manner.
Grid Layout Panel
Picture: Grid Layout Panel Demo

You will find this useful when you have to position your controls in proper way, in proper Row & Column. Note that, if you don’t create rows or columns and place multiple controls inside your naked Grid, you will see them overlapping each other. So, if you are using Grid be sure that you splitted your Grid in proper rows and columns.

“Canvas” Layout Panel

Canvas is the simplest layout available in Silverlight. It is very easy to understand and using this you can place any content any where inside the canvas. Not only this, you can also layered your application and by layering you can put your content front or back of any other control.
You can think Canvas as a HTML div Tag, where you can put your content in specific location by providing absolute left and top position. Have a look into the below image to get a brief idea on the same.

Canvas Panel
Picture: Canvas Layout Panel Structure

Lets think there are two Rectangles placed inside the Canvas as mentioned in the above figure. The first Rectangle (Blue one) is placed at the (10, 10) position. This is the coordinate location of your first Rectangle. First one stands for “Left” and second one stands for “Top”. So, What is the coordinate position of the second Rectangle (Orange one)? Exactly, it is Left =50 and Top = 30 i.e. (50, 30).

I think it is the right time to go for writing a sample code to create the above canvas with two Rectangles inside it. I am pretty much confident that, you have now a good confidence on the Canvas positioning.
Let us create a new UserControl named “CanvasPanelDemo” and then we will create two Rectangles in it and will place it in proper location.
1. Create a UserControl named “CanvasPanelDemo” in our Silverlight Application.
2. Open the CanvasPanelDemo.xaml file. You will see that there is a Grid named “LayoutRoot” inside your UserControl.
3. Now replace your Grid tag (<Grid>…</Grid>) with a Canvas tag (<Canvas>…</Canvas) and set the background color as Green:
<Canvas Background="Green" >

</Canvas>
4. Now, open your MainPage.xaml.cs file and modify your constructor to load the newly created CanvasPanelDemo Usercontrol in page load as a child to your LayoutRoot Grid:
LayoutRoot.Children.Add(new CanvasPanelDemo());
5. If you run your application now, you will see that your Canvas has taken the full screen of your browser window. Why? You didn’t set the Height & Width of your UserControl and placed inside a Grid. That’s why it took the full size of the browser window and that’s why you can see your Green canvas taking the whole screen.
6. We will now create two Rectangles and place it inside the Canvas. For the first time, we will not set any position to the rectangles. Lets see what happens then. Modify your XAML to look like this:
<Canvas Background="Green" >

<Rectangle x:Name="rectFirst" Fill="Blue" Height="80" Width="120"/>
<Rectangle x:Name="rectSecond" Fill="Orange" Height="100" Width="150"/>
</Canvas>
7. If you run your application again, you will see only one Rectangle present inside your Canvas. Which one? Yes, only the orange one. So, there you will ask “We added two Rectangle, one Green and another Orange. But why only the orange one is visible in the UI? What happened to the first rectangle?” So, my answer will be “Nothing happened to any of your added control. They all are placed inside the Canvas”.
Yes, that’s right. All the two rectangles are available inside your canvas. As we didn’t specify the position of the rectangles and the second rectangle is bigger than the first one, it placed on top of the other i.e. the orange one placed on top of the green rectangle. Whatever control you add at the end of the Canvas will have a higher Z-Index which places your control on top of the other. I will discuss on this later in this chapter.

Canvas Panel
Picture: Canvas Panel Demo 1 (without position)

8. Now, lets go for positioning the rectangles. We will set coordinate position (50, 50) to the first rectangle and coordinate position (200, 100) to the second rectangle. For doing this, we have to set the Canvas.Left and Canvas.Top properties of each Rectangle. Have a look into the following code. You will understand easily how to do this.
<Canvas Background="Green">

<Rectangle x:Name="rectFirst" Fill="Blue" Height="80" Width="120"
Canvas.Left="50" Canvas.Top="50" />
<Rectangle x:Name="rectSecond" Fill="Orange" Height="100" Width="150"
Canvas.Left="200" Canvas.Top="100" />
</Canvas>
9. Run your application and you will notice that the first rectangle has been placed at (Left=50, Top=50) location and the second one has been placed at (Left=200, Top=100) location. Your application will look similar to this:
Canvas Panel with proper position
Picture: : Canvas Panel Demo 2 (with proper position)

10. Now if you want to play around it, just modify your XAML to place the rectangle controls in various positions inside the canvas.

I think you are now familiar with positioning silverlight controls inside the Canvas. Let us discuss something on the Z-Index property. Z-Index stands for layering out your Silverlight application. If you are familiar with Photoshop you knew that, photoshop creates layers to position them on top of each other. Those who don’t know about it can learn it from here.
Suppose you want to create an application where two rectangles are there (similar to the previous example) and one rectangle is partially blocking the another. You have to write a logic to modify your application such that, when you click on the first rectangle it will come front of the another. Similar kind of logic for the second rectangle too.

So, how can we develop this? We have to use the Z-Index property for each rectangle. Lets say we will set the Z-Index of the first rectangle to 1 (one) and the second rectangle to 2 (two). Initially the second rectangle is blocking the first one partially. Now once you click on the first rectangle we will set the Z-Index of it to 2 and the Z-Index of the other rectangle to 1. As the Z-Index of the first rectangle is greater than the second it will come on top of the other. The same behaviour will be for the second rectangle. Once we click on the second rectangle (which is hiding behind the first) will come top the other will go behind. For doing this, we will set the Z-Index of the first rectangle to 1 and the second to 2.


1. Open the CanvasPanelDemo.xaml file and modify the Rectangle properties of Canvas.Left and Canvas.Top to place the rectangle on top of each other.
2. Now add the Canvas.ZIndex property to each rectangle. Set it to 1 for the first rectangle and set it to 2 for the second rectangle. After these modifications your xaml will look like this:
<Canvas Background="Green">

<Rectangle x:Name="rectFirst" Fill="Blue" Height="80" Width="120"
Canvas.Left="50" Canvas.Top="50" Canvas.ZIndex="1" />
<Rectangle x:Name="rectSecond" Fill="Orange" Height="100" Width="150"
Canvas.Left="92" Canvas.Top="74" Canvas.ZIndex="2" />
</Canvas>
3. Run your Silverlight application and you will see them in action. You will see the orange rectangle blocking a part of the blue rectangle.

Canvas Panel Demo
Picture: Panel Demo (ZIndex - 1)

4. Now let us write some logic to code behind (C#) to change the ZIndex property of the rectangles. To do this, first we will register the MouseLeftButtonDown event of both the rectangles in the constructor:
public CanvasPanelDemo()

{

InitializeComponent();
rectFirst.MouseLeftButtonDown += (rectFirst_MouseLeftButtonDown);
rectSecond.MouseLeftButtonDown += (rectSecond_MouseLeftButtonDown);
}
5. Now in the MouseLeftButtonDown event of the first rectangle we will set the ZIndex of the first rectangle to 2 and the second rectangle to 1. This will cause the first rectangle to come on top of the second rectangle.
private void rectFirst_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

{
Canvas.SetZIndex(rectFirst, 2);
Canvas.SetZIndex(rectSecond, 1);
}
6. In the MouseLeftButtonDown event of the second rectangle we will set the ZIndex of the first rectangle to 1 and the second rectangle to 2. This will cause the second rectangle to come on top of the first one.
private void rectSecond_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

{
Canvas.SetZIndex(rectFirst, 1);
Canvas.SetZIndex(rectSecond, 2);
}
7. Run your application to see it in action. At the initial time the second rectangle will be on top of the first one. When you click on the first rectangle it will come in front. Once you click on the second rectangle the first will go behind and thus the second rectangle will come at the front.
Canvas Panel Demo - ZIndex 2
Picture: Canvas Panel Demo (ZIndex - 2)

Canvas Panel Demo (ZIndex - 3)
Picture: Canvas Panel Demo (ZIndex - 3)


“StackPanel” Layout Panel

StackPanel is one of the most important panel in Silverlight. You will find it useful when you want to show some of your Silvelright elements either Horizontally or Vertically. It has a property called “Orientation”. You can set it appropriately as per your requirement.
Once you add some elements inside StackPanel, you will notice that they will place as a Stack on top of each other. Have a look into the following figure to get a clear understanding of the same.


Picture: StackPanel Orientation (Horizontal & Vertical)

Let us create an example to showcase the StackPanel demo:
1. Create a UserControl named “StackPanelDemo” in your Silverlight project
2. Now, open your MainPage.xaml.cs file and modify your constructor to load the newly created StackPanelDemo Usercontrol in page load as a child to your LayoutRoot Grid:
LayoutRoot.Children.Add(new StackPanelDemo());
3. Open the StackPanelDemo.xaml file and inside the Grid tag named “LayoutRoot” we will add two StackPanels (one Horizontal and another Vertical) with some Rectangles as Children.
4. The following XAML code will create a Vertical StackPanel which consists of four rectangles of different colors:
<StackPanel Orientation="Vertical" Background="SkyBlue" Height="200" 

Width="100" Grid.Column="0">

<Rectangle Height="50" Width="100" Fill="Red" />
<Rectangle Height="50" Width="100" Fill="Green" />
<Rectangle Height="50" Width="100" Fill="Blue" />
<Rectangle Height="50" Width="100" Fill="Yellow" />
</StackPanel>
5. The following code will create a Horizontal StackPanel which also contains four rectangles of different colors:
<StackPanel Orientation="Horizontal" Background="SkyBlue" Height="100" 

Width="300" Grid.Column="1">

<Rectangle Height="100" Width="60" Fill="Red" />
<Rectangle Height="100" Width="60" Fill="Green" />
<Rectangle Height="100" Width="60" Fill="Blue" />
<Rectangle Height="100" Width="60" Fill="Yellow" />
</StackPanel>
6. Now run your application and you will notice the following UI of your StackPanel Demo application. The left panel is your Vertical StackPanel whereas the right panel is the Horizontal StackPanel.
StackPanel Demo
Picture: StackPanel Demo


“ScrollViewer” Layout Panel


ScrollViewer is another layout container, which you will find interesting in some cases. Though it is not require to use in all the scenarios to hold elements but to show contents inside a scrollable panel like ListBox or Editor window you have to use ScrollViewer. ListBox, TextBox, RichTextBox internally uses ScrollViewer to implement the scrolling functionality.
Now come the question of implementing the scrollviewer functionality to our previous sample of StackPanel demo. If you add more Rectangles in the Vertical StackPanel in the previous demo application, you will notice that the rectangles are cropping inside the StackPanel as it has a fix height of 100. Now do the following to implement the scrolling functionality in the Vertical StackPanel:
1. Open the StackPanelDemo.xaml file to edit our previous XAML file
2. Remove the Height & Grid.Column properties from the StackPanel
3. Surround the StackPanel with ScrollViewer tag (<ScrollViewer> … </ScrollViewer>) and set the Height of the ScrollViewer to 200. Also add the Grid.Column = “0” to the ScrollViewer.
4. Add some more rectangles inside the StackPanel, so that, the ScrollBar got enabled for the ScrollViewer. After the modification of your XAML will look like this:
<ScrollViewer Height="200" Grid.Column="0">

<StackPanel Orientation="Vertical" Background="SkyBlue" Width="100">
<Rectangle Height="50" Width="100" Fill="Red" />
<Rectangle Height="50" Width="100" Fill="Green" />
<Rectangle Height="50" Width="100" Fill="Blue" />
<Rectangle Height="50" Width="100" Fill="Yellow" />
<Rectangle Height="50" Width="100" Fill="Red" />
<Rectangle Height="50" Width="100" Fill="Green" />
<Rectangle Height="50" Width="100" Fill="Blue" />
<Rectangle Height="50" Width="100" Fill="Yellow" />
<Rectangle Height="50" Width="100" Fill="Red" />
<Rectangle Height="50" Width="100" Fill="Green" />
<Rectangle Height="50" Width="100" Fill="Blue" />
<Rectangle Height="50" Width="100" Fill="Yellow" />
</StackPanel>
</ScrollViewer>
5. If you run the application now, you will see a ScrollBar on the right side of the panel. Thus it make your Rectangles to scroll properly.
ScrollViewer Panel Demo
Picture: ScrollViewer Panel Demo

Here note that, we set the Height to the ScrollViewer and not to the StackPanel. The reason behind this is, if you set the Height of the StackPanel it will have a fix height, thus it will not create the Scrolling behaviour. As we set the Height to the ScrollViewer the StackPanel height increases as and when you add child to it but the ScrollViewer here does a great job and creates a scrollbar cropping the StackPanel to the height of the ScrollViewer.


“Border” Layout Panel

It’s an another type of Layout Panel in Silverlight. But as like other panels it can’t contain multiple contents in it. Border supports only one child as a content. If you want to use Border as a container of multiple controls, you have to wrap those with anyother panel like Grid, Canvas etc. and then place it in the Border. So, what is Border actually? The name says it. It is a border. If we want to add some border in our Silverlight application, we can use it at that time.
Look into the following figure. Here you will see four different shapes. These shapes you can create using Border element. You can create your border filled with Solid color or Gradient color or you can use a transparent color.


Border Panel Example
Picture: Border Panel Example

After seeing the above figure, I think one question came to you mind that “I can create the same thing using the Rectangle too. Then what is the benefit of using Border?” Yes right. You can create the same thing using Rectangle too as we did earlier, but the main difference is “You can create a rounded corner shape using Border. It has the property called “CornerRadius”. If you set it to 45, means your shape will have a corner radius of 45 degree.
Let us create some borders in a demo application:
1. Create a UserControl named “BorderDemo” in your Silverlight project
2. Now, open your MainPage.xaml.cs file and modify your constructor to load the newly created BorderDemo Usercontrol in page load as a child to your LayoutRoot Grid:
LayoutRoot.Children.Add(new BorderDemo());
3. Open the BorderDemo.xaml file and inside the Grid tag named “LayoutRoot” we will add a Border as Content.
4. Let us add the first Border of Height=100 and Width=150 with a brown colored BorderThickness of 2:
<Border Height="100" Width="150" BorderThickness="2" BorderBrush="Brown"/>
Once run in browser you will see the following view:

Border Panel Demo 1
Picture: Border Panel Demo 1

5. Now we will modify this border to create a Rounded Corner border. To do this, we will add a property “CornerRadius” to it. We will set the value to 25 i.e. 25 degree. Your modified XAML will look like this:
<Border Height="100" Width="150" CornerRadius="25" BorderThickness="2" BorderBrush="Brown"/> 
Border Panel Demo 2
Picture: Border Panel Demo 2

6. Now we will change it a little to set a background color to it. Border has a property called “Background”. You can set the color there which you like. Here is the modified XAML of the same:
<Border Height="100" Width="150" CornerRadius="25" BorderThickness="2" BorderBrush="Brown" Background="Brown"/> 
If you run your Silverlight application now, you will see the following:
Border Panel Demo 3
Picture: Border Panel Demo 3

7. Let us modify it a little bit more to add a child inside it. We will put a Text “I am a TextBlock inside Border control”. Put the below code in your XAML. You will notice that I placed a TextBlock inside the <Border> … </Border> tag. You can place any control or panel inside the Border like this.
<Border Height="100" Width="250" CornerRadius="25" BorderThickness="2" BorderBrush="Brown" Background="Brown">

<TextBlock Text="I am a TextBlock inside Border control"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</Border>
Once you run, it will show similar to this:
Border Panel Demo 4
Picture: Border Panel Demo 4

Remember that, you can add only one child to the Border panel. If you need to add more than one child, add a different panel like Grid, Canvas or StackPanel inside the Border and then add the child elements to that panel. Think before chosing your panels.


“ViewBox” Layout Panel

ViewBox panel is another useful panel in Silverlight. It is actually not a new panel in Silverlight. It was available in Silverlight 3 toolkit, but Microsoft added it in the Silverlight 4 runtime for it’s demand. You can use ViewBox panel to stretch and scale a element control. Like Border it also has only and only one child. If you want to set more than one child, you have to use any other panel inside the ViewBox to hold other children controls.
As I told earlier, you can stretch and scale your control inside your ViewBox. It has a property called “Stretch” which has the following values:

1. Fill:
If you set the Stretch property to Fill, the content will fill the entire space of the ViewBox. It doesn’t preserve the aspect ratio.
<Viewbox Stretch="Fill" MaxWidth="100" MaxHeight="100" Name="viewBox1">

<Image Source="images/microsoft_silverlight.jpg"/>
</Viewbox> <Viewbox Stretch="Fill" MaxWidth="200" MaxHeight="200" Name="viewBox2">
<Image Source="images/microsoft_silverlight.jpg"/>
</Viewbox> <Viewbox Stretch="Fill" MaxWidth="300" MaxHeight="300" Name="viewBox3">
<Image Source="images/microsoft_silverlight.jpg"/>
</Viewbox>

//Set the Stretch property to Fillprivate void stretchFill(object sender, RoutedEventArgs e)

{
viewBox1.Stretch = Stretch.Fill;
viewBox2.Stretch = Stretch.Fill;
viewBox3.Stretch = Stretch.Fill;
}

ViewBox Demo 1
Picture: ViewBox Demo 1

2. None:
If you set the Stretch property to None, the content will preserve its original size.
<Viewbox Stretch="Fill" MaxWidth="100" MaxHeight="100" Name="viewBox1">

<Image Source="images/microsoft_silverlight.jpg"/>
</Viewbox> <Viewbox Stretch="Fill" MaxWidth="200" MaxHeight="200" Name="viewBox2">
<Image Source="images/microsoft_silverlight.jpg"/>
</Viewbox> <Viewbox Stretch="Fill" MaxWidth="300" MaxHeight="300" Name="viewBox3">
<Image Source="images/microsoft_silverlight.jpg"/>
</Viewbox>
//Set the Stretch property to None

private void stretchNone(object sender, RoutedEventArgs e)

{
viewBox1.Stretch = Stretch.None;
viewBox2.Stretch = Stretch.None;
viewBox3.Stretch = Stretch.None;
}
ViewBox Demo 2
Picture: ViewBox Demo 2

3. Uniform:
If you set the Stretch property to Uniform, the content will resize to fit the ViewBox. The ViewBox will take as much space as require to show the entire content and also preserves the aspect ratio.
<Viewbox Stretch="Fill" MaxWidth="100" MaxHeight="100" Name="viewBox1">

<Image Source="images/microsoft_silverlight.jpg"/>
</Viewbox> <Viewbox Stretch="Fill" MaxWidth="200" MaxHeight="200" Name="viewBox2">
<Image Source="images/microsoft_silverlight.jpg"/>
</Viewbox> <Viewbox Stretch="Fill" MaxWidth="300" MaxHeight="300" Name="viewBox3">
<Image Source="images/microsoft_silverlight.jpg"/>
</Viewbox>
//Set the Stretch property to Uniform

private void stretchNone(object sender, RoutedEventArgs e)

{
viewBox1.Stretch = Stretch.Uniform;
viewBox2.Stretch = Stretch.Uniform;
viewBox3.Stretch = Stretch.Uniform;
}
ViewBox Demo 3
Picture: ViewBox Demo 3

4. UniformToFill:
If you set the Stretch property to UniformToFill, the content will resize to fill the destination dimension. If the original size differs than the aspect ratio of the ViewBox, the content is then clipped to fit the ViewBox dimension.
<Viewbox Stretch="Fill" MaxWidth="100" MaxHeight="100" Name="viewBox1">

<Image Source="images/microsoft_silverlight.jpg"/>
</Viewbox> <Viewbox Stretch="Fill" MaxWidth="200" MaxHeight="200" Name="viewBox2">
<Image Source="images/microsoft_silverlight.jpg"/>
</Viewbox> <Viewbox Stretch="Fill" MaxWidth="300" MaxHeight="300" Name="viewBox3">
<Image Source="images/microsoft_silverlight.jpg"/>
</Viewbox>
//Set the Stretch property to UniformToFill

private void stretchNone(object sender, RoutedEventArgs e)

{
viewBox1.Stretch = Stretch.UniformToFill;
viewBox2.Stretch = Stretch.UniformToFill;
viewBox3.Stretch = Stretch.UniformToFill;
}
ViewBox Demo 4
Picture: ViewBox Demo 4

Overview

Silverlight 4 provides a large collection of UI controls for Silverlight application development. These controls are require to do the UI design of the application for giving a better representation to the user. You can customize the look & feel by creating your own Style or extending the control to give more power to the UI. I will describe the control styling in later chapters.
Here is some of the Silverlight 4 controls that I want to describe for you:
  1. TextBlock
  2. TextBox
  3. PasswordBox
  4. RichTextBox
  5. ComboBox
  6. ListBox
  7. CheckBox
  8. RadioButton
  9. Button

TextBlock

TextBlock is the primary element for displaying text inside your Silverlight Application. You will find it useful whenever you want to display some strings. TextBlock is a FrameworkElement available in the System.Windows.Controls namespace. There is a property named “Text” where you have to enter the text string.
<TextBlock Text="Hello Silverlight" />
This is not necessary for you to use the Text property to set some text inside your TextBlock control. TextBlock control can also be used as a container to set a para of strings. Hard enter to place a line break can be set using the <LineBreak/> control.
<TextBlock>
<TextBlock.Text>
This is the first line of Text.<LineBreak/>
This is the second line of Text.</TextBlock.Text>
</TextBlock>

OR

<TextBlock>
This is the first line of Text.<LineBreak/>
This is the second line of Text.
</TextBlock>

Also, you can represent a series of strings contained inside different Run elements instead of presenting as a single string. In that scenario, each Run element can have different font attributes set towards it. The LineBreak element will represent an explicit new line break
<TextBlock>
<LineBreak/>
<Run Foreground="Maroon"FontFamily="Arial"FontSize="30"
FontWeight="Bold">Arial Bold 30</Run>
<LineBreak/>
<Run Foreground="Teal"FontFamily="Times New Roman"FontSize="18"
FontStyle="Italic">Times New Roman Italic 18</Run>
<LineBreak/>
<Run Foreground="SteelBlue"FontFamily="Verdana"FontSize="14"
FontWeight="Bold">Verdana Bold 14</Run>
</TextBlock>

TextBlock
You will see various Properties and Events available for TextBlock control to do text formatting and other operation.

TextBlock Properties

TextBox

TextBox is another important element in Silverlight. It is also available inside the System.Windows.Controls. Unlike TextBlock, the TextBox inherits from the base class Control. Whenever you want to enter some text inputs from your user using your Silverlight application, you need the help of TextBox. It is one of the most important input control for Silverlight for data entry.
<TextBox Height="25" Width="200" Text="This is a Single Line TextBox"/>

<TextBox Height="100" Width="200"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto"
TextWrapping="Wrap"
Text="This is a Multi-Line TextBox. This is a Multi-Line TextBox."/>



public static readonly DependencyProperty AcceptsReturnProperty;
Set “AcceptsReturn” to True if you want to insert a Hard line break explicitly in your TextBox by your user. From code behind if you want to set the value to AcceptsReturnProperty of the TextBox, you have to call the SetValue() and then pass the DependencyProperty with the appropriate value:
myTextBox.SetValue(TextBox.AcceptsReturnProperty, true);
myTextBox.SetValue(TextBox.AcceptsReturnProperty, false);
From XAML, you can set it as:
<TextBox AcceptsReturn="True"/>

public static readonly DependencyProperty IsReadOnlyProperty;
Set “IsReadOnly” to True if you want your TextBox as only readable by your user. This is very useful when you are putting a Edit Button near your TextBox to give the user chose whether he wants to update some texts.
To set it from the code behind use the same format of the SetValue() method. Here’s the code:
myTextBox.SetValue(TextBox.IsReadOnlyProperty, true);

public static readonly DependencyProperty MaxLengthProperty; 
Set “MaxLength” to a positive numeric value , your user can’t add more than the specified value. Suppose you are setting it to 50, hence after inserting 50 characters the TextBox caret will not go forward.
You can set the Max Length property from code behind C# like this:
myTextBox.SetValue(TextBox.MaxLengthProperty, 150);
public static readonly DependencyProperty SelectionBackgroundProperty;
“SelectionBackground” color once set, your selected text will have the specified background. You can set both Solid Brush or Gradient Brush as your selection background. If you want to set it from code behind, use the following convention:
myTextBox.SetValue(TextBox.SelectionBackgroundProperty, new SolidColorBrush(Colors.Black));
public static readonly DependencyProperty SelectionForegroundProperty;
Like “SelectionBackground” the “SelectionForeground” will set the specified color as the foreground color of the selected text. The property SelectionForeground property can also be set in the same way. In this case, it will change the color of the font for the selected text. Have a look:
myTextBox.SetValue(TextBox.SelectionForegroundProperty, new SolidColorBrush(Colors.Black));

public static readonly DependencyProperty TextAlignmentProperty
 “TextAlignment” is responsible to set the text alignment to left, right, center or justify.
public static readonly DependencyPropertyTextProperty;
“Text” property contains the Text entered into the TextBox. You can set it in the same way from XAML & Code as I mentioned above.
public static readonly DependencyProperty TextWrappingProperty; 
Set “TextWrapping” to Wrap so that, if your entered text becomes longer than the specified width of the TextBox, it will populate the remaining text in a separate line (as described in the MultiLineTextBox figure).

PasswordBox

PasswordBox is available inside the System.Windows.Controls and inherits from Control. Whenever you need to add a Password field in your Silverlight application form to give the user access to login with credential, you have to use this password box. You will find it useful when you need to do login.
<PasswordBox Width="200" Height="25"Password="kunal2383" />
<PasswordBox Width="200" Height="25" Password="kunal2383"PasswordChar="X" />

Here are some useful DependencyProperty of the PasswordBox:
public static readonly DependencyProperty MaxLengthProperty;
Set “MaxLength” to a positive numeric value , your user can’t add more than the specified value. Suppose you are setting it to 50, hence after inserting 50 characters the TextBox caret will not go forward.
public static readonly Dependency PropertyPasswordCharProperty; 
Sets the password character of the control. The default value for password character of the field box is the asterisk (*). But you can change it by setting the value to this dependency property. If you set ‘X ‘ as password character, whatever you enter in the textbox of the field will display as ‘X’.
public static readonly DependencyPropertyPasswordProperty;
Gets or Sets the password property of the PasswordBox. If you set the text it will be visible in the UI in asterisk format.
public static readonly DependencyPropertySelectionBackgroundProperty; 
“SelectionBackground” color once set, your selected text will have the specified background.
public static readonly DependencyPropertySelectionForegroundProperty;
Like “SelectionBackground” the “SelectionForeground” will set the specified color as the foreground color of the selected text.

RichTextBox

Like TextBoxRichTextBox also inherits from Control and available in the namespace System.Windows.Controls. It is useful when you want to give a input box to your user where they can able to format the entered text like word processor. You can display text in various text format like Bold, Italic, Underline, Left/Right/Center align, various font size/color etc.
Have a look into the following XAML code where the RichTextBox has several <Paragraph> tag to split the text in various parts. You can use <Bold>,<Italic> tags to format the entered text. You can also align the text or change the font-size or font-color by setting the proper attributes to the <Paragraph> tag.
<RichTextBox Height="153"Width="336"AcceptsReturn="True">
<Paragraph>
This is a RichTextBox control having multiple paragraphs inside it.
You will find it more useful while creating an Editor control in Silvelight application.
<LineBreak />
</Paragraph>
<Paragraph>
<Bold>This Text is in Bold</Bold>
<LineBreak />
<Italic>This Text is in Italic</Italic>
</Paragraph>
<ParagraphTextAlignment="Right">
This Text is Right aligned.<LineBreak />
</Paragraph>
<ParagraphTextAlignment="Center">
<Hyperlink>This is an Hyperlink Button and center aligned</Hyperlink>
</Paragraph>
</RichTextBox>
Here is the output of the above XAML code:

You can see here that, not only formatted text you can also enter hyperlinks to the RichTextBox control. If you set the AcceptsReturn=”True” your user can explicitly enter hard line break by pressing the “Enter” key.

ComboBox

ComboBox is an items control which works like a ListBox but only one item is visible at a time. It inherits from Selector control and available in the System.Windows.Controls namespace. It contains ComboBoxItem which inherits from ListBoxItem. ComboBoxItem is also present in the same namespace as ComboBox is i.e. System.Windows.Controls namespace.
Let us create a simple ComboBox having some contents inside it. Set the Width of the ComboBox to a specific value, let’s say 200 in our case. Now add ComboBoxItem as the Items of the Combo. This step is not always require (in case of XAML atleast). Set some string as the “Content” of the ComboBoxItem. Here you may ask one question, is it only supports text? The answer is “No”. You can also set any FrameworkElement inside the Content of the ComboBoxItem, such as TextBlock, TextBox, Button, Rectangle etc.
Have a look into the XAML code here:
<ComboBox Width="200">
<ComboBox.Items>
<ComboBoxItem Content="Item 01"/>
<ComboBoxItem Content="Item 02"/>
<ComboBoxItem Content="Item 03"/>
<ComboBoxItem Content="Item 04"/>
<ComboBoxItem Content="Item 05"/>
<ComboBoxItem Content="Item 06"/>
<ComboBoxItem Content="Item 07"/>
<ComboBoxItem Content="Item 08"/>
<ComboBoxItem Content="Item 09"/>
<ComboBoxItem Content="Item 10"/>
</ComboBox.Items>
</ComboBox>
The output of the above XAML will initially look like the below figure:
Now once you click on the small arrow at the right side of the ComboBox, you will see a menu comes out from it containing the content you added there:

Here are some properties those you will find useful while working with the ComboBox:
IsDropDownOpen:
Once set to True the drop down will show with the content. By using this property you can programmatically control the visibility of the dropped menu. By default it is set to False and when you click on the small arrow it sets it to True and thus it opens up in the screen.
IsEditable:
From the name you can easily understand the functionality of this property. By default it is set as False. Hence, in the normal scenario you can’t type anything inside the ComboBox. If you want to edit the content of the ComboBox or want to type inside it, just set the value to True.
MaxDropDownHeight:
You can control the size of the drop down menu. If you set it to some numeric value, the height will be set as per the entered value.

ListBox

ListBox inherited from Selector present inside the System.Windows.Controls namespace. It contains ListBoxItem as Items. It represents it’s children as list. The followings are the DependencyProperties of ListBox:
public static readonly DependencyProperty IsSelectionActiveProperty;
public static readonly DependencyProperty ItemContainerStyleProperty;
public static readonly DependencyProperty SelectionModeProperty;
Some important properties are described below:
SelectionMode:
Gets or Sets the Selection Behaviour of ListBox control. There are three different modes of the Selection of the ListBoxItem: Single, where user can select only one ListBoxItem at a time; Multiple, where user can select multiple items without pressing a Modifier Key; Extended, where user can select multiple items by pressing a Modifier Key. The default mode is “Single”.
<ListBox Width="200"SelectionMode="Multiple" Height="200">
<ListBox.Items>
<ListBoxItem Content="Item 01"/>
<ListBoxItem Content="Item 02"/>
<ListBoxItem Content="Item 03"/>
<ListBoxItem Content="Item 04"/>
<ListBoxItem Content="Item 05"/>
<ListBoxItem Content="Item 06"/>
<ListBoxItem Content="Item 07"/>
<ListBoxItem Content="Item 08"/>
<ListBoxItem Content="Item 09"/>
<ListBoxItem Content="Item 10"/>
</ListBox.Items>
</ListBox>

The above example shows you how the ListBox looks like in different SelectionMode. The first example demonstrates “Multiple Selection Mode”. This type of listbox you need to give your user a choice to select multiple items. In the second example shows a simple “Single Selection Mode”, where the user can only select a single choice.

CheckBox

Checkbox inherits from ToggleButton and resides inside System.Windows.Controls namespace. Using this you can give your user a choice to select multiple items. There are three different states for CheckBox. If checked will return true, unchecked will return false and the third state returns null value. Generally the third state is not that much useful in normal scenarios. Use “Content” to set value (e.g. string, rectangle etc) to the checkbox.
Have a look into the following example:
<CheckBoxIsChecked="True"Content="Set as Checked (True)" />
<CheckBoxIsChecked="False"Content="Set as UnChecked (False)" />
<CheckBoxIsThreeState="True"IsChecked="{x:Null}"Content="Set as Third State (Null)" />
<CheckBoxIsEnabled="False"IsChecked="True"Content="Set as Checked, but disabled" />
<CheckBox>
<CheckBox.Content>
<Grid>
<EllipseHorizontalAlignment="Stretch" Fill="Red" />
<TextBlock Text="Multi Element as Checkbox Content" />
</Grid>
</CheckBox.Content>
</CheckBox>

The first code demonstrates the Checked item, the second code demonstrates unchecked item and third code demonstrates the third state. Third states becomes null. In the fourth code you will see the disabled state of the checkbox. What about the fifth code? Yup, in the fifth code we have added a Ellipse and a TextBlock wrapped with a Grid panel. It is not always necessary to set string as content. As per your requirement you can set anything. But be sure that CheckBox.Content only supports a single element and if you want to set multiple elements wrap with a panel as I demonstrated above.

RadioButton

Like CheckBox the element name RadioButton placed inside System.Windows.Controls assembly namespace also inherits from ToggleButton and contains the same properties as described above in CheckBox examples.
<RadioButtonIsChecked="True" Content="Set as Checked (True)" />
<RadioButtonIsChecked="False" Content="Set as UnChecked (False)" />
<RadioButton>
<RadioButton.Content>
<Grid>
<EllipseHorizontalAlignment="Stretch" Fill="Red" />
<TextBlock Text="Multi Element as RadioButton Content" />
</Grid>
</RadioButton.Content>
</RadioButton>
<RadioButtonGroupName="MyGroup" Content="Set under MyGroup"IsChecked="True" />
<RadioButtonGroupName="MyGroup" Content="Set under MyGroup" />


Normally if you are setting multiple radio buttons inside a page, you can select only one of them. If you need your user to select radio button from each different group of your option you can set a group name to the radio button. By grouping the options using a group name will allow your user to select a single radio option from each group.

Button

Button control in Silverlight inherits from ButtonBase class and can be found under the System.Windows.Controls namespace. Button controls are mainly require to Submit forms or for navigation panels. You can style it as per your need.
You can set some text as it’s content or can place any framework element inside it. If you want to add more than one element inside it, you have to use any panel wrapped to your elements.
See the below code on how we can use Button controls:
<StackPanel x:Name="LayoutRoot" Margin="20" Background="White">
<Button Content="I am a button control" Height="25" Width="200" Margin="5" />
<Button Height="25" Width="200" Margin="5">
<Button.Content>
<CheckBox Content="Checkbox inside Button" />
</Button.Content>
</Button>
<Button Width="200">
<Button.Content>
<StackPanel Orientation="Horizontal">
<Rectangle Width="30" Height="25" Fill="Green" Margin="0,0,5,0" />
<TextBlock Text="Rectangle inside Button" />
</StackPanel>
</Button.Content>
</Button>
</StackPanel>
The first example is a simple button control whereas the second contains checkbox as it’s content. The third example contains a Rectangle and a Text wrapped by Grid panel. This shows how we can use panel to load multiple elements inside a button.

Button has Click event where you can write your logic to do whatever you want once you click on the button e.g. navigation to a different view, submitting the form etc.

1 comment:

  1. Are you trying to make money from your websites or blogs by popup advertisments?
    If so, have you considered using Propeller Ads?

    ReplyDelete