sticky
Getting Started FAQ RRS feed

  • Question

  • Contents

    1.What are the common steps to debug WCF related issues?

    2. How can I communicate between Silverlight and HTML elements?

    2.1. How can I call a Scriptable method from JavaScript?

    2.2. How can I call a client JavaScript function from code behind?

    2.3. How can I access HTML elements from code behind?

    3.How can I debug JavaScript code in a Silverlight-enabled website with Visual Studio?

    4.How can I handle Out-Of-Browser related issues?

    4.1. How can I detect whether my application works on OOB Mode?

    4.2. How can I check OOB updates?

    4.3. How can I embed HTML elements into Silverlight application?

    4.4. How can I invoke JavaScript/access HTML elements on Silverlight when it works on OOB Mode?

    4.5. How can we access cookie in Silverlight?

    5.How can I debug OOB applications?

    6.How can I get the network status with OOB mode?

    7. How can I convert XAML to image?

    8. How can I use Perspective 3D?

    9. When and how to use Isolate Storage?

    10. How can I interact between two Silverlight applications hosted in the same page?

    11. How can I specify the installation UI?

    12. What is Element Binding?

    13. What is Binary Xml?

    14. How can Silverlight Applications communicate with each other?

    15. How can we access local fonts in Silverlight?

    16. What is Silverlight Navigation Application?

    1What are the common steps to debug WCF related issues? 

    By default, Silverlight uses Browser HTTP stack. In this case, if an error occurred on the WCF service it would send HTTP 404 response and details about the error would not be accessible to the Silverlight client. To get exception details we can use client HTTP stack. 

     

    To do so, please try the following steps:

     

    1. Add the following code when your application starts. (Please note this is only for debugging purpose)

     

    WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);

    WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);

     

     

    2. Click the “Debug”->”Exceptions”.  Select “Common Language Runtime Exceptions”.

     

    3. Click “Tools”->”Options”->”Debugging”.  Uncheck “Enable Just My Code (Managed Only)” to get more exception details.                

    Note after you perform this step, exceptions that are already handled properly by your application will also cause a break during debugging. Sometimes you may want to break on specific exceptions only, such as System.Net.WebException. In this case, please expand the tree and choose what you want.

     

    4. At server side, set includeExceptionDetailInFaults property to “True”.

    This specifies whether to include managed exception information in the detail of SOAP faults returned to the client.  Please refer to the following web.config setting segment.

     

    <system.serviceModel>

          <behaviors>

             <serviceBehaviors>

                 <behavior name="SimpleWCFBehavior">

                     <serviceMetadata httpGetEnabled="true" />

                     <serviceDebug includeExceptionDetailInFaults="True" />

                 </behavior>

             </serviceBehaviors>

          </behaviors>

           <services>

             <service behaviorConfiguration="SimpleWCFBehavior" name="SimpleWCF">

                 <endpoint address="" binding="basicHttpBinding" contract="ISimpleWCF">

                     <identity>

                         <dns value="localhost" />

                     </identity>

                </endpoint>

                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

             </service>

          </services>

     </system.serviceModel>

     

    You can also refer to the following documentations for more details:

    http://msdn.microsoft.com/en-us/library/dd470100(VS.95).aspx

    http://msdn.microsoft.com/en-us/library/system.servicemodel.description.servicedebugbehavior.includeexceptiondetailinfaults.aspx

    http://msdn.microsoft.com/en-us/library/dd920295(VS.95).aspx

    http://msdn.microsoft.com/en-us/library/dd470096(VS.95).aspx

     

    2 How can I communicate between Silverlight and HTML elements?

     2.1. How can I call a Scriptable method from JavaScript?

    1.       Add ScriptableMember to the target method.

    [ScriptableType]

    public class JavasSriptClass

    {

         [ScriptableMember]

         public string CallScriptableMethod(string parametername)

         {

             return "The Parameter Name is " + parametername;

          }

    }             

    2.       Register the managed object for scriptable access by JavaScript code.

              HtmlPage.RegisterScriptableObject("basic", new JavaScriptClass());

     

    3.       Call this method in your HTML page.

    function callScriptableFun(parameter)

    {

    var control = document.getElementById("SilverlightControl");

    var res = control.content.basic.CallScriptableMethod(parameter);

    }

           Note: SilverlightControl is your Silverlight Control’s  ID.

                                   

                Reference URLs

    http://msdn.microsoft.com/en-us/library/system.windows.browser.htmlpage.registerscriptableobject(VS.95).aspx

        2.2. How can I call a client JavaScript function from code behind?

    using System.Windows.Browser;

    HtmlPage.Window.CreateInstance("Your Function Name", new string[] { "parameter1","parameter2"  });        

         

     

         2.3. How can I access HTML elements from code behind

    using System.Windows.Browser;

    HtmlDocument doc = HtmlPage.Document;

    doc.GetElementById("target controls ID").SetProperty("innerHTML", "<b>hello world</b>");

     

    3How can I debug JavaScript code in a Silverlight-enabled website with Visual Studio?

    To enable this, please right click your web project and choose “Properties”. On the properties window, navigate to Web tab and uncheck “Silverlight”.  See this.

    4How can I handle Out-Of-Browser related issues?

    4.1. How can I detect whether my application works on OOB Mode?

    Some possible scenarios that you may add different behaviors according to the application’s working mode.  To do this, you can try either of the following approaches.

         Approach 1: 

                    Application.Current.IsRunningOutOfBrowser

         Approach 2: 

                    HtmlPage.IsEnabled

    4.2. How can I check OOB updates?

           We can call CheckAndDownloadUpdateAsync() method and handle UpdateCompleted event  when the application starts.

    private void Application_Startup(object sender, StartupEventArgs e)

    {

             this.CheckAndDownloadUpdateAsync();

             this.RootVisual = new MainPage();

    }

                   

    public App()

    {

                this.Startup += this.Application_Startup;

                this.Exit += this.Application_Exit;

                this.UnhandledException += this.Application_UnhandledException;

                this.CheckAndDownloadUpdateCompleted += new CheckAndDownloadUpdateCompletedEventHandler(App_CheckAndDownloadUpdateCompleted);

                InitializeComponent();

               

    }

    void App_CheckAndDownloadUpdateCompleted(object sender, CheckAndDownloadUpdateCompletedEventArgs e)

     {

                if (e.UpdateAvailable) {

                    MessageBox.Show("There are new updates downloaded. Please restart!");

                }

       }

               Note:  Updates cannot refresh itself unless we restart the application.

    4.3. How can I embed HTML elements into Silverlight application?

    First set the Silverlight application’s Windowless property to “True”. When the Windowless property is set to True, the Silverlight plug-in and the HTML page will be rendered in the same window. Otherwise, the plug-in will be rendered in its own window.

    Add your content to a div and force it display above your Silverlight application.  We can adjust the div’s z-index.  Please refer to the following code segment.

    document.getElementById(id).style.zIndex = index;

           

    4.4. How can I invoke JavaScript/access HTML elements on Silverlight when it works on OOB Mode?

    This feature is not supported yet. On OOB mode, HTML bridge doesn’t work anymore.  

    4.5. How can we access cookie in Silverlight?

           When our application is hosted in a web page, we can access cookie by using the following code.

    public class CookieManager

        {

            public static void SetCookie(string key, string val, TimeSpan? expires)

            {

                SetCookie(key, val, expires, null, null, false);

            }

            public static void SetCookie(string key, string val, TimeSpan? expires, string path, string domain, bool secure)

            {

                StringBuilder fullCookie = new StringBuilder();

                fullCookie.Append(string.Concat(key, "=", val));

                if (expires.HasValue)

                {

                    DateTime expire = DateTime.UtcNow + expires.Value; fullCookie.Append(string.Concat(";expires=", expire.ToString("R")));

                }

                if (path != null)

                {

                    fullCookie.Append(string.Concat(";path=", path));

                }

                if (domain != null)

                {

                    fullCookie.Append(string.Concat(";domain=", domain));

                }

                if (secure)

                {

                    fullCookie.Append(";secure");

                }

                HtmlPage.Document.SetProperty("cookie", fullCookie.ToString());

            }

            public static string GetCookie(string key)

            {

                string[] cookies = HtmlPage.Document.Cookies.Split(';');

                foreach (string cookie in cookies)

                {

                    string[] keyValue = cookie.Split('=');

                    if (keyValue.Length == 2)

                    {

                        if (keyValue[0].ToString() == key)              

                            return keyValue[1];

                    }

                }

                return null;

            }

        }

                   

    However, when the application works on OOB mode, the approach above doesn’t work anymore. As a workaround, we can store the data in IsolatedStorageFile.  For example,

    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;

    using System.Net.Browser;

    using System.IO;

    using System.Text;

    using System.IO.IsolatedStorage;

    namespace CookiesEx

    {

        public partial class MainPage : UserControl

        {

            public MainPage()

            {

                InitializeComponent();

            }

            private void button1_Click(object sender, RoutedEventArgs e)

            {

                InitializeWebRequestClientStackForURI();

                ReadFromIsolatedStorage();

            }

            private void InitializeWebRequestClientStackForURI()

            {

                // Create the client WebRequest creator.

                IWebRequestCreate creator = WebRequestCreator.ClientHttp;

                // Register both http and https.

                WebRequest.RegisterPrefix("http://", creator);

                WebRequest.RegisterPrefix("https://", creator);

                // Create a HttpWebRequest.

                HttpWebRequest request = (HttpWebRequest)

                    WebRequest.Create("http://api.search.live.net/clientaccesspolicy.xml");

                //Create the cookie container and add a cookie.

                request.CookieContainer = new CookieContainer();

                // This example shows manually adding a cookie, but you would most

                // likely read the cookies from isolated storage.

                request.CookieContainer.Add(new Uri("http://api.search.live.net"),

                    new Cookie("id", "1234"));

                // Send the request.

                request.BeginGetResponse(new AsyncCallback(ReadCallback), request);

            }

            // Get the response and write cookies to isolated storage.

            private void ReadCallback(IAsyncResult asynchronousResult)

            {

                HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

                HttpWebResponse response = (HttpWebResponse)

                    request.EndGetResponse(asynchronousResult);

                using (IsolatedStorageFile isf =

                    IsolatedStorageFile.GetUserStoreForSite())

                {

                    using (IsolatedStorageFileStream isfs = isf.OpenFile("CookieExCookies",

                        FileMode.OpenOrCreate, FileAccess.Write))

                    {

                        using (StreamWriter sw = new StreamWriter(isfs))

                        {

                            foreach (Cookie cookieValue in response.Cookies)

                            {

                                sw.WriteLine("Cookie: " + cookieValue.ToString());

                            }

                            sw.Close();

                        }

                    }

                }

            }

            private void ReadFromIsolatedStorage()

            {

                using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForSite())

                {

                    using (IsolatedStorageFileStream isfs =

                       isf.OpenFile("CookieExCookies", FileMode.Open))

                    {

                        using (StreamReader sr = new StreamReader(isfs))

                        {

                            tb1.Text = sr.ReadToEnd();

                            sr.Close();

                        }

                    }

                }

            }

        }

    }

    Related Links: 

    http://msdn.microsoft.com/en-us/library/dd920298(VS.95).aspx

    http://msdn.microsoft.com/en-us/library/system.web.httpcookie.httponly.aspx

               

    5How can I debug OOB applications?

    Solution 1: 

    1. Install and run the OOB application
    2. Open Visual Studio 2008/2010
    3. Click Debug -> “Exceptions” -> select “Common Language Runtime Exceptions”.
    4. Click “Tools” -> ”Options” -> ”Debugging”.  Uncheck “Enable Just My Code(Managed Only)”
    5. Click “Debug” -> ”Attach to Process”  -> Find and add SLLauncher.exe process.

     Solution 2: 

    1. Install the application onto the computer

    2. Set the Start Action to “Installed out-of-browser application”

    3. Save all files in the project

    4. Set a breakpoint in the OOB application’s main form :

    5. Press F5 and now you are debugging the OOB application!

    Recommended link: 

    http://www.silverlight.net/learn/videos/all/out-of-browser-experiences/

    6How can I get the network status with OOB mode?

    To detect network status, handle the NetworkAddressChanged event.  Please refer to the following code.

    public MainPage()

    {

           InitializeComponent();

           Loaded += new RoutedEventHandler(MainPage_Loaded);

           NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(NetworkChange_NetworkAddressChanged);

    }

    void NetworkChange_NetworkAddressChanged(object sender, EventArgs e)

    {

           CheckNetwork();

    }

    void MainPage_Loaded(object sender, RoutedEventArgs e)

    {

           CheckNetwork();

    }

    private void CheckNetwork()

    {

         if (NetworkInterface.GetIsNetworkAvailable()) { tbNetwork.Text = "Connected"; }

         else { tbNetwork.Text = "Disconnected"; }

    }

    7. How can I convert XAML to image?

    Solution 1: 

    Send the XAML snip to server.  On the server side, we can use WPF to render the XAML snip, create a screenshot and save it as a bitmap image. Finally, download the bitmap image. 

    Solution 2:

    Use WriteableBitmap to render XAML to image.  Please refer to the following links.

    http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap.aspx

    http://cfx.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=35920 (Please refer to CSSL3WriteableBitmap, this sample shows you how to save bitmap image to file)

    8. How can I use Perspective 3D?

    A new feature in Silverlight 3 is the Perspective Transforms. With Perspective Transforms you can simulate rotating an object in 3D space. Note that this is not a real 3D ( For example, camera, light , model and etc are not supported), Silverlight 3 does not support real 3D yet.

    Please refer to the following sample.

    <Image x:Name="imgTarantula" Width="400" HorizontalAlignment="Center" VerticalAlignment="Center"   

     Source="http://terraristic.net/photos/Acanthoscurria_geniculata/Acanthoscurria_geniculata_1.jpg">

            <Image.Projection>

                      <PlaneProjection RotationX="45"></PlaneProjection>

            </Image.Projection>

    </Image>

    For more, please refer to our All-In-One Code Framework.

    http://cfx.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=35920

    (Please refer to CSSL3PlaneProjection project)

    9.  When and how to use Isolate Storage?

    Five of the most common scenarios to use Isolate Storage are described as follows:

    • Downloaded controls
    • Persistent Web application storage
    • Shared component storage
    • Server storage
    • Roaming user profiles

    Scenarios not recommended to use Isolate Storage :

    • Store sensitive content, such as unencrypted keys or passwords
    • Store code
    • Store configuration and deployment settings            

    There is a working sample below.

    private void SaveData(string data, string fileName)

    {

                using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())

                {

                    using (IsolatedStorageFileStream isfs = new IsolatedStorageFileStream(fileName, FileMode.Create, isf))

                    {

                        using (StreamWriter sw = new StreamWriter(isfs))

                        {

                            sw.Write(data); sw.Close();

                        }

                    }

                }

            }        

           

            private string LoadData(string fileName)

            {

                string data = String.Empty;

                using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())

                {

                    using (IsolatedStorageFileStream isfs = new IsolatedStorageFileStream(fileName, FileMode.Open, isf))

                    {

                        using (StreamReader sr = new StreamReader(isfs))

                        {

                            string lineOfData = String.Empty;

                            while ((lineOfData = sr.ReadLine()) != null) data += lineOfData;

                        }

                    }

                }

                return data;

            }

    We can refer to this link.

    http://msdn.microsoft.com/en-us/library/3ak841sy(VS.80).aspx

    http://msdn.microsoft.com/en-us/library/kbcw921f(VS.80).aspx

    10.  How can I interact between two Silverlight applications hosted in the same page?

    Local Connection API is the preferred way to communicate between multiple Silverlight applications using messaging system. This enables different Silverlight applications to send/receive messages.  Below is part of its sample code.

               

    namespace Skyscraper

    {

       public partial class MainPage : UserControl

        {

            LocalMessageSender msgSender = new LocalMessageSender("Skyscraper");

            public MainPage()

            {

                InitializeComponent();

                LocalMessageReceiver receiver = new LocalMessageReceiver("Header");

                receiver.MessageReceived += new EventHandler<MessageReceivedEventArgs>(receiver_MessageReceived);

                receiver.Listen();

                CrashingCar.Completed += new EventHandler(CrashingCar_Completed);

            }

            void CrashingCar_Completed(object sender, EventArgs e)

            {

                msgSender.SendAsync("crashed");

            }

            void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)

            {

                if (e.Message.ToLower() == "startcrash")

                {

                    CrashingCar.Begin();

                }

            }

        }

    }

    We can get more details from the following video tutorial

     http://www.silverlight.net/learn/videos/all/localconnection-api/.

    11.  How can I specify the installation UI?

    Please refer to the following sample.

    http://blogs.msdn.com/webnext/archive/2009/03/23/how-to-build-a-good-install-ux-with-silverlight.aspx

    12. What is Element Binding?

    Element to element binding is a new feature in SL3. With this feature, we can set a control’s property value according to another control’s property value. Here is a normal element to element binding example:

            <TextBox x:Name="tb"></TextBox>

            <TextBlock Text="{Binding Text,ElementName=tb}"></TextBlock>

    In this example the second Textblock will display whatever you enter in the textbox. 

    In addition, it is really nice for a Master/detail view scenario, here is an example.

            <ListBox x:Name="lb" ItemsSource="YourItemsSource"></ListBox>

            <dataFormToolkit:DataForm CurrentItem="{Binding SelectedItem,ElementName=lb}">

            </dataFormToolkit:DataForm>

    In this program, whenever you select an item in the Listbox, the dataform will immediately refresh itself and display the exact item you selected.

    For a more specified tutorial please watch this video by clicking the link below.

    http://silverlight.net/learn/videos/silverlight-videos/element-to-element-binding/

    13. What is Binary Xml?

    Generally speaking, Binary Xml refers to any specification which defines the compact representation of Xml in a binary format.   Here, you can understand it in this way that anything transferred will be in binary format. 

    Before SL3, we can only use TextMessageEncoding. That means everything we send and receive is actually a plain text.  Obviously it has many downturns, such as high requirement of bandwidth and low client capacity, etc. To be more specific, because it is transferring as plain text, the amount of data is relatively large (in compare with BinaryMessageEncoding).  It means clients and servers will need more bandwidth to do their jobs correctly.  Also because of the large data, the server will need to perform more processes, so basically the capacity of clients is reduced.

    Now with BinaryMessageEncoding being supported, we can transfer things with binary format. Comparing with the plain text format transfer, it has achieved a great improvement. 

    This is an example of how to configure a binding with BinaryMessageEncoding.

     <bindings>

          <customBinding>

             <binding name="binaryHttpBinding">

                <binaryMessageEncoding />

                <httpTransport />

             </binding>

          </customBinding>

       </bindings>

    In addition, you can enable BinaryMessageEncoding via pure C# code.  You just need to write several lines as the code block below.

    BinaryMessageEncodingBindingElement binary = new   BinaryMessageEncodingBindingElement();
    HttpTransportBindingElement transport = new HttpTransportBindingElement();
    CustomBinding binding = new CustomBinding(binary, transport);

    If you want BinaryMessageEncoding to cooperate with Windows Authentication, please read this thread.

    http://forums.silverlight.net/forums/t/110022.aspx

    14. How can Silverlight Applications communicate with each other?

    By the Local Messaging feature we can let two Silverlight Applications communicate with each other:

            LocalMessageSender _localsender = new LocalMessageSender(“Sender”);         

           _localsender.SendCompleted += localsender_SendCompleted;

           void localsender_SendCompleted(object sender, SendCompletedEventArgs e)        {               

          if(e.Error!=null)               MessageBox.Show("Cannot connect to another client.");      

           }

    To receive a message, you can use the following code.

                  LocalMessageReceiver messageReceiver = new LocalMessageReceiver("receiver");

                 messageReceiver.MessageReceived += new   EventHandler<MessageReceivedEventArgs>(receiver_MessageReceived);

                  try{    messageReceiver.Listen();     }

            catch (ListenFailedException){

            MessageBox.Show(    "Cannot receive messages." + Environment.NewLine +"There is already a receiver with the name

                                                     'receiver'.",        "LocalMessageReceiver", MessageBoxButton.OK);      

             }

    Get a complete application sample from the link below or download it to your local computer or just browse the source code online.

          http://cfx.codeplex.com/sourcecontrol/changeset/view/35597?projectName=cfx#679082

    The CSSL3LocalMessage or VBSL3LocalMessage is what you are looking for.

    15. How can we access local fonts in Silverlight?

    So far, we can only use JavaScript API to access local fonts.  The JavaScript function should be like this:

                 Function (plugIn, rootElement) {             

                 this.plugIn = plugIn;   //the Silverlight plugin          

                var gtc = plugIn.settings.GetSystemGlyphTypefaces();

                for (i = 0; i < gtc.count; i++){              

                       gtf=gtf.getItem(i)if (gtf.FontUri == "comic.ttf") {

                      var glyph = rootElement.children.findName("glyph");  glyph.SetSource(gtf,, ""); //must include "" 

               }}}

              

    Here is a good discussion on how to use it. In addition, it contains a full implemented code of a user.

     http://forums.silverlight.net/forums/t/103128.aspx

     

    16. What is Silverlight Navigation Application?

     Navigation Application is a pre-defined application template, which frees people from caring about the navigation part of a web site like application.  The application itself provided a very good-looking and popular way of navigating along with the possibility to customize, so that you can have a unique application.

                    To create a navigation application, please follow the steps below .

                   1. Click file button at top-left corner of Visual Studio.

                   2. In the dropdown menu, click ‘New Project’.

                   3. In the popup window, choose Silverlight from the Templates tree.  Then choose Silverlight Navigation Application.  Then click ok.

    Then the Visual Studio will automatically create an application template for us. In the MainPage.xaml, we can find the navigation bar and the content frame’s define code. The navigation bar’s code snippet  is as follows.

                <Border x:Name="LinksBorder" Style="{StaticResource LinksBorderStyle}">

                    <StackPanel x:Name="LinksStackPanel" Style="{StaticResource LinksStackPanelStyle}">

                        <HyperlinkButton x:Name="Link1" Style="{StaticResource LinkStyle}"

                                         NavigateUri="/Home" TargetName="ContentFrame" Content="home"/>

                        <Rectangle x:Name="Divider1" Style="{StaticResource DividerStyle}"/>

                        <HyperlinkButton x:Name="Link2" Style="{StaticResource LinkStyle}"

                                         NavigateUri="/About" TargetName="ContentFrame" Content="about"/>

                    </StackPanel>

                </Border>

     When adding a new page, please add a new HyperlinkButton in the LinksStackPanel so that users could navigate to that page. The code block should be like this.

                <Border x:Name="LinksBorder" Style="{StaticResource LinksBorderStyle}">

                    <StackPanel x:Name="LinksStackPanel" Style="{StaticResource LinksStackPanelStyle}">

                    <HyperlinkButton x:Name="Link1" Style="{StaticResource LinkStyle}" NavigateUri="/Home"

                                                    TargetName="ContentFrame" Content="home"/>                                                                              

                        <Rectangle x:Name="Divider1" Style="{StaticResource DividerStyle}"/>

                                        <HyperlinkButton x:Name="Link2" Style="{StaticResource LinkStyle}"

                                         NavigateUri="/About" TargetName="ContentFrame" Content="about"/>

                                 <Rectangle x:Name="Divider1" Style="{StaticResource DividerStyle}"/>

                                         //newly added seperator so the UI looks nice

                        <HyperlinkButton x:Name="Link2" Style="{StaticResource LinkStyle}"

                              NavigateUri="/NewPage" TargetName="ContentFrame" Content="about"/>

                        //newly added button direct to the new page

                   </StackPanel>

                </Border>

     In case you want to navigate or access control in the MainPage from content Frame, here is a code block for your reference.

    ((MainPage)App.Current.RootVisual).ControlName  //code before the dot get you the MainPage’s reference

    For more detailed information please check out this video by clicking the link below.

             http://www.silverlight.net/learn/videos/all/navigation-framework/

     

    Thursday, March 18, 2010 5:22 AM