2009-12-15 3 views
1

Я только начинаю разбираться с silverlight 3, исходя из ASP.NET и Flex.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(); 
    } 

не повезло. Ive также попробовал только init'n новый основной и установил его видимость, но это, конечно, не работает.

Я даже приближаюсь к этому правильным способом?

Большое спасибо.

Редактировать - ОК после того, как выкапывают немного дальше, this выглядит как подход, который будет делать то, что им после, но он чувствует себя немного хакированным! Является ли это предложенным способом для siverlight 3? Thanks Again

ответ

2

Что я обычно делал, так это создать «MainPage.xaml», который имеет тип System.Windows.Controls.Navigation. Это присваивается свойству 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

Это отличный подход, красивый и чистый. Thanks Ken – Jammin

2

Есть 3 типа контейнеров в SL3

  1. Страницы (Просмотров)
  2. элементы управления UserControl
  3. ChildWindows (всплывающие окна)

Не поменяться UserControls, его плохая идея, это в основном означает очистку содержимого «MainPage» и добавление нового UserControl.Делая то, что вы теряете поведение «Назад/Четвертое» браузера, так как URL-адрес никогда не изменяется, это не так, как была разработана Платформа навигации, вы скорее свопите страницы (представления) с помощью 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 является страница (не UserControl), при запуске вашей загрузки страницы по умолчанию для NavigationFrame должна быть ваша страница Войти.

UserControls предназначены для использования в целях повторного использования, которые могут быть развернуты на нескольких страницах.

Смежные вопросы