How to switch Silverlight UserControls

23 thoughts on “How to switch Silverlight UserControls”

  1. You might want to add the following piece of code to your post to document how to make this run:

    private void Application_Startup(object sender, StartupEventArgs e)
    {
    // Load the main control

    this.RootVisual = new UserControlContainer();
    Page p = new Page();
    ((UserControlContainer)this.RootVisual).SwitchControl(p);
    }

  2. This was very helpful to me. Just the simple and elegant page switching approach I needed.

  3. Great post, how do I update switch the control if I want to update the Silverlight Control from the hosting web page? I have a .aspx page and based on a selection that a user makes, I want to change the Silverlight control to be displayed. However in the .aspx.cs I don’t have access to the UserControlContainer.

  4. I did this using startup params.
    The “flow” goes something like this :

    1. User requests page so server builds page
    2. server sends page to client and client scripts execute
    3. silverlight objects are executed

    So …

    In your aspx page html you put the standard object tag with this in it :

    depending on requirements you can either edit this object tag on the server or the client.

    1 Of the params I pass in is a “StartingControl” which in the App.Xaml.cs file I do this with :

    void Application_Startup(object sender, StartupEventArgs e)
    {
    switch(e.InitParams[“StartupControl”])
    {
    case “Control1” :
    this.RootVisual = new Control1();
    break;
    ….
    }
    }

    This gives you switching functionality before the silverlight object is loaded.

    Combine the 2 samples and you can make whatever changes you need at any point.

    🙂

  5. In an application with – say 1000 – pages, do all of these pages get streamed to the client (browser), or just the currently visible page?

  6. Well if by “pages” you mean Silverlight canvases/controls, then yes, they all get packaged in your XAP file and sent to your browser at the same time. Using Silverlight 3 though you can do some more interesting deferred loading of resources.

  7. The InitParams solution is good for views that only change when the web page is refreshed. My solution is for when you need to keep a long-runnning instance of the same control.

  8. It depends how you implement your concept of a user. If you are using the commonly used cookie-based forms authentication scheme then you could make a Web service call to a logout/login method and change user that way.

  9. Oh my god that is the most useful thing Ive ever found on
    the internet!! Thankyou. Your neat little fix just made my
    coursework work!!

  10. How about just clear and add the children collection
    directly in the transfer event like private void
    cmdSLControl_Click(object sender, RoutedEventArgs e) {
    LayoutRoot.Children.Clear(); LayoutRoot.Children.Add(new
    SilverlightControls());
    //((UserControlContainer)Application.Current.RootVisual).SwitchControl(new
    SilverlightControls()); }

  11. Just call this function with required page u want load…. dats it

    public void SwitchControl(UserControl newControl)
    {
    LayoutRoot.Children.Clear();

    LayoutRoot.Children.Add(newControl);

    }

  12. This is a useful post.Can you explain me switching rootvisuals between silverlight test project and silverlight3 main project.If i try this i get an error
    Unable to cast object of type ‘Microsoft.Silverlight.Testing.UnitTesting.UI.TestPage’ to type ‘com.bgt.li.UserControlContainer’.

Comments are closed.