Добавить Shell Navigation шаблоны для разных страниц Xamarin.Forms Shell - PullRequest
0 голосов
/ 03 марта 2020

У меня есть многостраничное приложение, в котором есть раздел preLogin и postLogin. Каков наилучший подход к созданию шаблонов оболочки для этих двух разделов? Страницы preLogin не имеют кнопки в навигационной панели. Я пробовал на странице xaml NavigationPage.HasNavigationBar="false" (не в AppShell.xaml, на моей странице xaml), а также в коде NavigationPage.SetHasNavigationBar(this, false);

примера страницы xaml, которая независимо от моего NavigationPage.HasBackButton="false"

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
             xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:customViewEntry="clr-namespace:App.CustomViews.Entries"
             xmlns:header="clr-namespace:App.CustomViews.CustomHeaders"
             mc:Ignorable="d"
             x:Class="App.Views.Login.EnterEmailAndPasswordPage" 
             NavigationPage.HasBackButton="false"
             BackgroundImageSource="Login_Screen_Green.png">
    <ContentPage.Content>
        <StackLayout>
            <header:HeaderWithTopRightIcon ImageUri="greenIcon.png"/>
            <StackLayout VerticalOptions="EndAndExpand" Padding="0,50">
                <customViewEntry:EvEntry 
                Placeholder="Enter your email"/>
                <customViewEntry:EvEntry 
                Placeholder="Enter your password"
                IsPassword="True"/>
                <Button 
                Text="LOGIN"
                Margin="25,0"
                CornerRadius="7"
                BackgroundColor="{StaticResource DarkGrayColor}"
                TextColor="White"
                Command="{Binding OpenEmailVerificationPageCommand}"/>
                <Label 
                Padding="0,25,0,0"
                Text="Don't have an account?"
                FontSize="Small"
                Style="{StaticResource WhiteSmallLabelStyle}"
                HorizontalOptions="Center"
                VerticalOptions="Start"/>
                <Label 
                Text="SIGN UP"
                TextDecorations="Underline" 
                FontSize="Small"
                Style="{StaticResource WhiteSmallBoldLabelStyle}">
                    <Label.GestureRecognizers>
                        <TapGestureRecognizer Command="{Binding SignUpClickCommand}"/>
                    </Label.GestureRecognizers>
                </Label>
            </StackLayout>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

мой AppShell выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<Shell xmlns="http://xamarin.com/schemas/2014/forms" 
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       xmlns:d="http://xamarin.com/schemas/2014/forms/design"
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
       mc:Ignorable="d"
       xmlns:views="clr-namespace:App.Views"
       xmlns:loginViews="clr-namespace:App.Views.Login"
       x:Class="App.AppShell"
       FlyoutBehavior="Disabled">

    <!--Styles and Resources-->
    <Shell.Resources>
        <ResourceDictionary>
           ...removed due simplicity...
        </ResourceDictionary>
    </Shell.Resources>
    <ShellContent ContentTemplate="{DataTemplate loginViews:EnterEmailPage}"/>
</Shell>

Итак, мои вопросы 1. Как динамически скрыть кнопку назад на некоторых страницах, а на некоторых нет? Для навигации я использую await Shell.Current.GoToAsync(route) 2. Также мне нужно перенаправление, когда пользователь покидает приложение, и снова вводить его по истечении времени, чтобы перенаправить на страницу preLogin (вход в систему) или разрешить ему напрямую postLogin (полный доступ к приложению) поэтому мне нужны, может быть, два класса AppShell и называть его различными оболочками OnResume ()?

1 Ответ

1 голос
/ 04 марта 2020

Как динамически скрыть кнопку назад на некоторых страницах, а на некоторых нет? Для навигации я использую await Shell.Current.GoToAsyn c (маршрут)

Об этом вопросе есть Обходное решение для вас.

Оболочка Приложение имеет Поведение кнопки «Назад» , чтобы динамически переворачивать кнопку «Назад», даже можно скрыть / показать ее.

При использовании Shell.Current.GoToAsync(route) для навигации к пункту назначения странице, вы можете следовать приведенному ниже коду для использования на странице назначения.

// Button click to show Back Button
private void Button_Clicked_Show(object sender, EventArgs e)
{
    Shell.SetBackButtonBehavior(this, new BackButtonBehavior
    {
        IsEnabled = true
    });
}

// Button click to hide Back Button
private void Button_Clicked_Hide(object sender, EventArgs e)
{
    Shell.SetBackButtonBehavior(this, new BackButtonBehavior
    {
        IconOverride = "null.png", // null.png not exists in project ,just want 

программа для отображения пустой кнопки «Назад» IsEnabled = false}); }

Я покажу эффект с Gif:

enter image description here

Также мне нужно перенаправление, когда пользователь покидает приложение, и снова введите его в зависимости от истекшего времени, чтобы перенаправить на страницу preLogin (вход в систему) или разрешить ему напрямую postLogin (полный доступ к приложению), поэтому мне могут понадобиться два класса AppShell и назвать его различными оболочками OnResume ()?

Об этом вопросе есть Предложение для вас, вы можете подумать, что подойдет для ваших нужд.

Вы можете использовать Navigation.PushModalAsync(new LoginPage()) для перенаправления на страницу preLogin на основе истекшего времени. В противном случае используйте Shell.Current.GoToAsync(route) для навигации. Вы можете справиться с ними в методе OnResume.

Например, следующим образом:

protected override void OnResume()
{
    if(time > xxx)
    {
        Navigation.PushModalAsync(new LoginPage());
    }
    else
    {
        Shell.Current.GoToAsync(route);
    }
}

Здесь используется PushModalAsync для входа на страницу, которая является страницей модели. После использования Navigation.PopModalAsync() можете закрыть LoginPage и перенаправить на другую страницу с помощью Shell.Current.GoToAsync(route).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...