Xamarin.forms перейти на другую страницу в оболочке от нажатия кнопки на странице - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь выяснить, как перемещаться по страницам оболочки из события нажатия кнопки на отдельных страницах. Я хочу, чтобы нажатие кнопки было таким же, как при открытии меню и выборе следующей страницы. Например, у меня будет ряд страниц, где я собираю информацию от пользователя для создания отчета. Я хочу, чтобы пользователь ввел некоторые данные на первой странице и щелкнул рядом с go на 2-й странице, чтобы ввести дополнительную информацию и так далее. Я хочу сохранить меню страницы оболочки так, чтобы, если пользователь решит, что ему нужно go вернуться на страницу, чтобы изменить ранее введенную информацию, он может открыть меню оболочки и выбрать страницу, а не нажимать кнопку назад. Нажмите кнопку n раз, чтобы вернуться на предыдущую страницу.

Я попытался использовать маршрутизацию и Shell.Current.GoToAsyn c () для достижения этой цели, но получил пустую ссылку в Main.cs в строке UIApplication.Main(args, null, "AppDelegate"); Я избегаю использования Navigation.PushModalAsync(new Page2());, потому что в этом навигации образом убирает меню гамбургера с моей страницы оболочки. Я также попытался создать функцию в ShellPage.xaml.cs под названием Change_Page (), которую я вызываю нажатием кнопки на первой странице. в этой функции я попробовал тот же Shell.Current.GoToAsync("myPage2"), который снова привел к ошибке нулевого задания, а также Shell.Current.CurrentItem = myPage2;, который привел к разрыву в той же строке, но вставил ошибку, я получил некоторую проблему UIKit.UIApllication, которая не Кажется, он отображает ошибку, но остановил отладчик здесь.

ShellPage.xaml

...
<FlyoutItem Title="Page1">
    <ShellContent>
        <views:Page1View Title="Page1" x:Name="myPage1" Route="myPage1"/>
    </ShellContent>
</FlyoutItem>
<FlyoutItem Title="Page2">
    <ShellContent>
        <views:Page2View Title="Page2" x:Name="myPage2" Route="myPage2"/>
    </ShellContent>
</FlyoutItem>
<FlyoutItem Title="Page3">
    <ShellContent>
        <views:Page1View Title="Page1" x:Name="myPage3" Route="myPage3"/>
    </ShellContent>
</FlyoutItem>
...

myShellPage.xaml.cs

[DesignTimeVisible(false)]
    public partial class MyShellPage : Shell
    {
        public MyShellPage()
        {
            InitializeComponent();

            Routing.RegisterRoute("myPage1", typeof(CallInfoPage));
            Routing.RegisterRoute("myPage2", typeof(SpillInfoPage));
            Routing.RegisterRoute("myPage3", typeof(ItemsPage));

            Device.StartTimer(TimeSpan.FromSeconds(3), () =>
            {
                // Do something
                Current.CurrentItem = myPage3; // throws error 'myPage3' does not exist in current context
                return false; // True = Repeat again, False = Stop the timer
            });
        }
    }

Page1View.xaml

...
<Button Text="Next" Clicked="Next_Clicked" />
...

Page1View.xaml.cs

...
async void Next_Clicked(System.Object sender, System.EventArgs e)
    {
        await Shell.Current.GoToAsync("myPage2");
    }
...

1 Ответ

0 голосов
/ 26 марта 2020

Вам также необходимо Зарегистрировать маршруты страниц при запуске.

В конструкторе подкласса Shell или любом другом месте, которое выполняется до вызова маршрута, дополнительные маршруты могут быть явно зарегистрированы для любые страницы, которые не представлены в визуальной иерархии командной консоли:

Routing.RegisterRoute("pageone", typeof(ItemsPage));
Routing.RegisterRoute("pagetwo", typeof(AboutPage));

Затем к этим страницам можно перейти с помощью навигации на основе URI из любого места в приложении. Маршруты для таких страниц известны как глобальные маршруты.

async void NavigateThird_Clicked(object sender, EventArgs e)
{
    await Shell.Current.GoToAsync("pagetwo");
}

Работает.

enter image description here

О AppShell не может вызовите Shell.Current.GoToAsync("myPage2") или Shell.Current.CurrentItem = myPage2 в методе конструктора . Кроме того, вы хотите показать меню гамбургера, вы увидите, Current.GoToAsync не может этого сделать. Здесь вам нужно использовать Current.CurrentItem для реализации этого. У меня есть обходной путь с помощью Timer, чтобы вызвать их задержку на некоторое время.

public AppShell()
{
    InitializeComponent();

    Routing.RegisterRoute("pageone", typeof(ItemsPage));
    Routing.RegisterRoute("pagetwo", typeof(AboutPage));
    Routing.RegisterRoute("pagethird", typeof(PageThird));

    Device.StartTimer(TimeSpan.FromSeconds(3), () =>
    {
        // Do something
        Current.CurrentItem = pagethird;
        return false; // True = Repeat again, False = Stop the timer
    });
}

Xaml код:

<FlyoutItem Title="main"
            FlyoutDisplayOptions="AsMultipleItems">
    <ShellContent x:Name="pageone" Title="Page1" FlyoutIcon="icon.png" ContentTemplate="{DataTemplate local:ItemsPage}" Route="pageone" />
    <ShellContent x:Name="pagetwo" Title="Page2"
                    FlyoutIcon="icon.png"
                    ContentTemplate="{DataTemplate local:AboutPage}" Route="pagetwo" />
</FlyoutItem>
<FlyoutItem Title="Two" x:Name="pagethird">
    <ShellContent  Title="Page3"
                    FlyoutIcon="icon.png"
                    ContentTemplate="{DataTemplate local:PageThird}"
                    Route="pagethird" />
</FlyoutItem>

Эффект:

enter image description here

...