2009-12-15 7 views
1

Je commence juste à me familiariser avec silverlight 3, venant d'ASP.NET et de Flex.Siliverlight 3 Navigation entre les commandes utilisateur?

J'ai suivi le nouveau tutoriel de navigation here et j'ai également lu les didacticiels d'authentification et de gestion des rôles. Donc, j'ai une page principale, qui a un cadre, à l'intérieur de la grille, et plusieurs vues. Ceux-ci sont tous navigables et fonctionnent bien. Je vois cette page principale comme une sorte de master page pour ma petite application.

Alors sais que je veux avoir un UserControl login.xaml. Cela gérera toutes les connexions et une fois authentifié, je veux naviguer sur la MainPage, et utiliser son cadre pour aller à partir de là. Je ne veux pas simplement utiliser la connexion en tant que page séparée dans mon cadre, car je veux que la connexion utilise une autre grille pour le reste de l'application, et aussi pour être séparé.

Alors, comment naviguer d'un contrôle d'utilisateur (connexion) à un autre (principal)?

J'ai essayé

private void btnLogin_Click(object sender, RoutedEventArgs e) 
    { 
     //TO - DO: All the auth work, just want navigation sorted first 

     this.Visibility = Visibility.Collapsed; 
     App.Current.RootVisual = new MainPage(); 
    } 

Avec pas de chance. J'ai aussi essayé juste init'n une nouvelle main et en définissant sa visibilité mais cela ne marche bien sûr pas. Est-ce que je m'approche même de la bonne manière?

Merci beaucoup.

Éditer - Ok après avoir creusé un peu plus loin, this ressemble à une approche qui fera ce qu'il faut après, mais il se sent un peu hackish! Est-ce la manière suggérée pour siverlight 3? Merci encore

Répondre

2

Ce que j'ai l'habitude de faire est de créer un "MainPage.xaml" qui est de type System.Windows.Controls.Navigation. Cela est assigné à la propriété RootVisual de mon application; il est à peu près vide, sauf pour un cadre de navigation:

<navigation:Page 
x:Class="Client.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
mc:Ignorable="d" 
d:DesignWidth="400" 
d:DesignHeight="400" MinWidth="700" MinHeight="480" 
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
Title="Main SlideLinc Page"> 
<Grid x:Name="LayoutRoot"> 
    <navigation:Frame x:Name="rootFrame" /> 
</Grid> 
</navigation:Page> 

Puis-je utiliser le cadre de navigation « de rootFrame » pour gérer tous mes besoins de navigation, par exemple, avec ces méthodes d'une classe NavigationManager statique:

public static void Navigate(string url, Action<Exception, UIElement> callback) 
    { 
     Navigate(new Uri(url, UriKind.RelativeOrAbsolute), callback); 
    } 

    public static void Navigate(Uri uri, Action<Exception, UIElement> callback) 
    { 
     if (rootFrame == null) 
     { 
      Logger.LogMessage("Can't use navigation, because rootFrame is null"); 
      ErrorMessageBox.Show(ClientStrings.NavigationFailed); 
     } 
     else 
     { 
      NavigatedEventHandler successHandler = null; 
      NavigationFailedEventHandler failureHandler = null; 
      successHandler = (s, e) => 
       { 
        rootFrame.Navigated -= successHandler; 
        rootFrame.NavigationFailed -= failureHandler; 
        if (callback != null) 
        { 
         callback(null, e.Content as UIElement); 
        } 
       }; 
      failureHandler = (s, e) => 
       { 
        rootFrame.Navigated -= successHandler; 
        rootFrame.NavigationFailed -= failureHandler; 
        if (callback != null) 
        { 
         callback(e.Exception, null); 
        } 
       }; 
      rootFrame.Navigated += successHandler; 
      rootFrame.NavigationFailed += failureHandler; 
      rootFrame.Navigate(uri); 
     } 
    } 

donc, dans votre cas, vous pouvez l'utiliser comme:

NavigationManager.Navigate(new Uri("/Login.xaml", UriKind.Relative), null); 

Ou:

NavigationManager.Navigate(new Uri("/Home.xaml", UriKind.Relative), (error, element) => InitializeElement(element)); 
+0

C'est une bonne approche, agréable et propre. Merci Ken – Jammin

2

Il y a 3 types de conteneurs dans SL3

  1. Pages (Vues)
  2. UserControls
  3. ChildWindows (popups)

N'échangez pas UserControls, c'est une mauvaise idée, il signifie essentiellement effacer le contenu "MainPage" et ajouter un nouveau UserControl.En faisant cela, vous perdez le comportement Back/Forth du navigateur puisque l'URL ne change jamais, ce n'est pas comme cela que le cadre de navigation a été conçu, vous changez plutôt de Pages (views) en utilisant le NavigationService.

private void btnLogin_Click(object sender, RoutedEventArgs e) 
    { 
     //TO - DO: All the auth work, just want navigation sorted first 

     NavigationService.Navigate(new Uri("/HomePage.xaml", UriKind.Relative)); 
    } 

maintenant HomePage.xaml est une page (pas un UserControl), au démarrage de votre page de chargement par défaut pour la NavigationFrame devrait être votre page de connexion. UserControls sont des fonctionnalités réutilisables qui peuvent être déployées sur plusieurs pages.

Questions connexes