2009-12-15 13 views
1

我剛剛開始接觸來自ASP.NET和Flex的Silverlight 3。Siliverlight 3用戶控件之間的導航?

我已經按照新的導航教程here閱讀了認證和角色管理教程。

所以,我有一個主頁,其中有一個框架,在網格內和幾個視圖。這些都是可導航的,工作正常。我把這個主頁看作是我的小應用程序的母版頁,我有我的想法。

所以知道我想要一個login.xaml UserControl。這將處理所有登錄,一旦通過身份驗證,我想導航到MainPage,並使用其框架從那裏進入。

我不想只是簡單地使用登錄作爲我的框架內的分離頁面,因爲我希望登錄使用不同的網格到應用程序的其餘部分,也是分開的。

那麼,我將如何從一個用戶控件(登錄)導航到另一個(主)?

我已經試過

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(); 
    } 

沒有運氣。我也嘗試過只是初始化一個新的主體並設置其可見性,但這當然不起作用。

我是否以正確的方式接近這個?

非常感謝。

編輯 - 確定後,進一步挖掘,this看起來像一種方法,將做什麼即時消息後,但它確實感到有點hackish!這是siverlight 3的建議方式嗎?再次感謝

回答

2

我通常做的是創建一個System.Windows.Controls.Navigation類型的「MainPage.xaml」。這被分配給我的應用程序的RootVisual屬性;這幾乎是空的,除了導航框架:

<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> 

然後我用「rootFrame」導航框架來處理我所有的導航需求,例如,用從靜態NavigationManager類這些方法:

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); 
     } 
    } 

所以你的情況,你可以使用它像:

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

或者:

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

這是一個偉大的方法,很乾淨。 謝謝肯 – Jammin 2009-12-16 09:09:59

2

有3種類型的容器中SL3

  1. 頁面(查看)
  2. 用戶控件
  3. ChildWindows(彈出窗口)

不要交換用戶控件,它是一個壞主意,它基本上意味着清除「MainPage」內容並添加一個新的UserControl。通過這樣做,你會失去瀏覽器的Back/Forth行爲,因爲URL永遠不會改變,那不是如何設計Navigation Framework,而是通過使用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)); 
    } 

現在HomePage.xaml是一個頁面(而不是用戶控件),在啓動時的NavigationFrame您的默認加載網頁應該是你的登錄頁面。

UserControls旨在成爲可重複使用的功能,可以部署在多個頁面上。