Siliverlight 3 Навигация между пользовательскими элементами управления? - PullRequest
1 голос
/ 15 декабря 2009

Я только начинаю изучать Silverlight 3 из ASP.NET и Flex.

Я ознакомился с новым руководством по навигации здесь и прочитал также руководства по аутентификации и управлению ролями.

Итак, у меня есть главная страница с рамкой, внутри сетки и несколькими видами. Все они ориентированы и работают нормально. Я считаю эту главную страницу своего рода главной страницей моего небольшого приложения, которое я имею в виду.

Итак, знайте, что я хочу иметь 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(); 
    }

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

Я даже правильно подхожу к этому?

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

Edit - Хорошо, после копания немного дальше, этот выглядит как подход, который будет делать то, что я после, но он действительно немного хакерский! Это рекомендуемый способ для siverlight 3? Еще раз спасибо

Ответы [ 2 ]

2 голосов
/ 16 декабря 2009

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

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

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

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

2 голосов
/ 16 декабря 2009

Что я обычно делал, так это создавал 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));
...