Click here to Skip to main content
15,881,831 members
Articles / Silverlight / Silverlight4

Navigation Framework in Silverlight 4

Rate me:
Please Sign up or sign in to vote.
4.71/5 (6 votes)
12 Apr 2011CPOL3 min read 51K   6   6
Navigation framework in Silverlight 4

Navigation is an important and one of the basic aspects of web application. In earlier versions of Silverlight, Navigation system was missing, until Silverlight 3. This blog post is all about the concept of Navigation Framework and an attempt to summarize the overall concept. [Check online Demo of this post].

Basic Concept

Frame

  • The concept of Navigation system revolves around Frame. Frame Control acts as a container for pages, it validates the state and maintains the navigation history.
  • A Frame can host one page at a particular time.

Manas Patnaik Blog

Source: Source property of Frame defines the default page to load when the application is initialized.
Navigate (URI uri): Navigate method navigates to the specific URI from code.

HTML
<sdk:Frame Margin="0,37,0,-15" 
Name="frameContainer" 
Source="/View/Home.xaml"/>

Page

  • Pages are the superset of controls which are capable of Navigation and allow itself to load inside a frame.
  • It is important to know the relation between Frame and Page.The above figure illustrates the relation between them. Frame is responsible for navigating to a particular page with the URI. Once page has been loaded, it can access the host Navigation system by NavigationContext and NavigationService.

Step By Step with a Example

Create a Silverlight Application

  • Let's create a Silverlight Application from Visual Studio. As shown in the figure, we have added some pages to the Silverlight project.

    Manas Patnaik Blog

  • The MainPage will load the content pages (In View Folder) with a click of navigation Hyperlinks.

    Manas Patnaik Blog

Add Event Handler to Navigate

For the project, XAML code of the MainPage is as follows:

XML
<Grid x:Name="LayoutRoot" Background="White"> 
<sdk:Frame Margin="0,37,0,-15" 
Name="frameContainer" 
Source="/View/Home.xaml"/> 

<HyperlinkButton Content="Home" 
Height="19" HorizontalAlignment="Left" 
Margin="12,12,0,0" Name="hlHome" 
VerticalAlignment="Top" Width="39" Click="hlHome_Click" /> 
<HyperlinkButton Content="About" 
Height="19" HorizontalAlignment="Left" 
Margin="57,12,0,0" Name="hlAbout" 
VerticalAlignment="Top" Width="35" /> 
<HyperlinkButton Content="Customer" 
Height="19" HorizontalAlignment="Left" 
Margin="98,12,0,0" Name="hlCustomer" 
VerticalAlignment="Top" Width="62" /> 
</Grid>

Notice the HyperlinkButtonHome” click Event. It calls the code behind logic of navigating to the particular page.

C#
private void hlHome_Click(object sender, RoutedEventArgs e) 
{ 
this.frameContainer.Navigate(new Uri("/View/Home.xaml", UriKind.Relative )); 
}

Add Error Page for Resource Not Found

The frame can handle the following events while navigating to a page:

C#
<sdk:Frame Margin="0,37,0,-15" 
Name="frameContainer" 
Source="/View/Home.xaml" 
NavigationFailed="frameContainer_NavigationFailed" /> 
private void frameContainer_NavigationFailed(object sender, 
    System.Windows.Navigation.NavigationFailedEventArgs e) 
{ 
e.Handled = true; 
frameContainer.Navigate(new Uri("/View/ErrorPage.xaml", UriKind.Relative)); 
}

Navigation Through XAML

Instead of the above coding approach, we can specify Hyperlink NavigateUri property to their relative URIs.

XML
<HyperlinkButton Content="About" 
Height="19" HorizontalAlignment="Left" 
Margin="57,12,0,0" Name="hlAbout" 
VerticalAlignment="Top" Width="35" 
NavigateUri="/View/About.xaml" 
TargetName="frameContainer" 
/>

Hiding Resources Through URI Mapper

Sometimes, it is necessary to hide your resource location also the long URL for the particular page is not so user-friendly. So we can use URIMAPPER to enable with short and meaningful names for URIs. Suppose for this example, the user should be allowed to navigate the Customers page with adding “/Customers” to the URL. To use URIMAPPING, we need the following 2 references to our mainpage.xaml page:

XML
xmlns:navigation=
    "clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
xmlns:uriMapper=
    "clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation"
  • Our next step will be adding mapping to the Frame Control.
    XML
    <sdk:Frame Margin="0,37,0,-15" 
    Name="frameContainer" 
    Source="/View/Home.xaml" 
    NavigationFailed="frameContainer_NavigationFailed" > 
    
    <navigation:Frame.UriMapper> 
    <uriMapper:UriMapper> 
    <uriMapper:UriMapping Uri="/Customers" 
    MappedUri="/View/Customers.xaml" /> 
    </uriMapper:UriMapper> 
    </navigation:Frame.UriMapper> 
    
    </sdk:Frame>

    Now we need to set the Hyperlink navigateURI property as /”Customers “. So this will ensure that the “/Customer” is mapped to the mentioned MapeedUri.

    XML
    <HyperlinkButton Content="Customer" 
    Height="19″ HorizontalAlignment="Left" 
    Margin="98,12,0,0″ Name="hlCustomer" 
    VerticalAlignment="Top" Width="62″ 
    NavigateUri="/Customers" 
    />

Now, Customers page can be accessible by the new User friendly URI. “http://localhost:6469/NavigationSystemTestPage.aspx#/Customers”

Accessing Navigation System from a Page

  • As we mentioned above, a page can access navigation system using NavigationService. In this example, we have a DashBoard page which required to be loaded once the user clicks on the button in the customers page. This can be achieved through code behind in Customers page on button click event.
    C#
    private void btnShowDashBoard_Click(object sender, RoutedEventArgs e) 
    { 
    NavigationService.Navigate(new Uri("/Admin/DashBoard.xaml", UriKind.Relative)); 
    }

    NavigationService allows the page to get the host navigation service that is used to navigate to this page.

    Manas Patnaik Blog

Final Words

Silverlight navigation supports much more complex navigation logic such as Fragmented Navigation, Content loader, etc. This post only touches the basics of navigation. More posts will follow soon about navigation and Silverlight.

You can download the source code here.

You can take a look at the online demo here.

Links and References

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Microsoft
India India
Nothing special .. I like challenges and love my critics.

Microsoft | Bangalore | India

Blog : http://manaspatnaik.com/blog

Twitter@manas_patnaik

Comments and Discussions

 
QuestionNavigation Framework in Silverlight 4 Pin
tsz_www88828-May-14 20:56
tsz_www88828-May-14 20:56 
GeneralMy vote of 5 Pin
vinod deo from navi mumbai25-Mar-13 7:37
vinod deo from navi mumbai25-Mar-13 7:37 
QuestionOther Navigation Posts Pin
lymber131-Jul-12 20:46
lymber131-Jul-12 20:46 
QuestionNavigation Framework in Silverlight 4 Pin
Mayur Bheda24-Nov-11 3:59
Mayur Bheda24-Nov-11 3:59 
AnswerRe: Navigation Framework in Silverlight 4 Pin
Manas_Patnaik24-Nov-11 4:15
Manas_Patnaik24-Nov-11 4:15 
GeneralRe: Navigation Framework in Silverlight 4 Pin
Mayur Bheda25-Nov-11 1:01
Mayur Bheda25-Nov-11 1:01 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.