Katherine
Katherine

Reputation: 4143

PRISM Navigation - Xamarin Forms - MasterDetail/FlyoutPage page setup, previous page nav links disabled when back button pressed?

So I built an app using Prism Library and Xamarin Forms and the Navigation flow starts with a MasterDetail page, like so.

NavigationService.NavigateAsync($"/{nameof(MainMenuPage)}/{nameof(NavigationPage)}/{nameof(DashboardPage)}");

MainMenuPage

My MainMenuPage contains the Flyout page with a ListView of the MenuItems

<FlyoutPage.Flyout>
    <NavigationPage
        NavigationPage.HasNavigationBar="false"
        Icon="{ StaticResource HamburgerIcon }"
        Style="{ StaticResource MainMenuStyle }"
        Title="{ grial:Translate PageTitleMainMenu }">
        <x:Arguments>
            <ContentPage>
                <Grid>
                    <BoxView
                        Style="{ StaticResource MainMenuOrModalBackgroundStyle }"
                        Opacity="1" />

                    <Image
                        Style="{ StaticResource MainMenuBackgroundImageStyle }" />

                    <Grid
                        grial:Effects.ApplyIOSSafeAreaAsPadding="Left,Right"
                        RowSpacing="0"
                        VerticalOptions="FillAndExpand">
                        <Grid.RowDefinitions>
                            <RowDefinition
                                    Height="Auto" />
                            <RowDefinition
                                    Height="*" />
                            <RowDefinition 
                                    Height="Auto"/>
                        </Grid.RowDefinitions>

                        <local:BrandBlock
                                Grid.Row="0"
                                Grid.Column="0"
                                Margin="20,60,20,30"
                                VerticalOptions="Start"
                                HorizontalOptions="Start" />

                        <ListView
                                Margin="0,0,0,10"
                                Grid.Row="1"
                                SelectedItem="{ Binding SelectedMainMenuItem, Mode=TwoWay}"
                                ItemsSource="{ Binding MainMenuItems }"
                                VerticalOptions="FillAndExpand"
                                Style="{ StaticResource MainMenuListViewStyle }">
                            <ListView.ItemTemplate>
                                <DataTemplate>
                                    <ViewCell>
                                        <views:MainMenuItemTemplate />
                                    </ViewCell>
                                </DataTemplate>
                            </ListView.ItemTemplate>
                            <ListView.Behaviors>
                                <behavior:EventToCommandBehavior EventName="ItemTapped"
                                                                 Command="{Binding NavigateCommand}"
                                                                 EventArgsParameterPath="Item">
                                                                 
                                </behavior:EventToCommandBehavior>
                            </ListView.Behaviors>
                        </ListView>

                        <views:ApplicationVersionTemplate Grid.Row="2" Margin="35,0,0,20" HorizontalOptions="Start" VerticalOptions="Start" />
                    </Grid>
                </Grid>
            </ContentPage>
        </x:Arguments>
    </NavigationPage>
</FlyoutPage.Flyout>

<FlyoutPage.Detail>
    <NavigationPage>
        <x:Arguments>
            <ContentPage>
                <Grid></Grid>
            </ContentPage>
        </x:Arguments>
    </NavigationPage>
</FlyoutPage.Detail>

I'm navigating to the detail pages using the following format:

await NavigationService.NavigateAsync($"{nameof(NavigationPage)}/{SelectedMainMenuItem.PageName}", null, SelectedMainMenuItem.IsModal, SelectedMainMenuItem.IsAnimated);

I noticed in a lot of the samples, the MasterDetailPage.Master node is in a ContentPage not a NavigationPage node like I'm doing. Is that what I'm doing wrong? It looks to me like NavigationPage is a child of Master here. Is that correct? Just trying to figure out why when I go back to a previous page (by pressing the back button in the navbar) the page is disabled, meaning the navigation links no longer work. My initial root page navigation is absolute, all the rest of the Navigate commands are relative.

Note - I changed the MasterDetailPage to FlyoutPage since the naming changed in Xamarin.Forms v5. This bug was happening before I changed the name to FlyoutPage.

Upvotes: 0

Views: 394

Answers (2)

Katherine
Katherine

Reputation: 4143

So, I rolled back my code to a previous version and then, one at a time, added back in the packages and code changes, smoke testing each iteration along the way. My best guess is there was a conflict between Telerik UI for Xamarin package and the latest Xamarin Forms version but I can't be sure. I updated Xamarin Forms and Prism to latest update and it's all working fine.

Upvotes: 0

Haukinger
Haukinger

Reputation: 10873

I don't know about FlyoutPage.Detail, but MasterDetailPage.Content should be left empty in xaml, it's filled automatically when navigating.

Also, with MasterDetailPage, I navigate to ../SomeOtherPage to add it to the stack (enable back button). Navigate to /MainPage/NavigationPage/AnotherPage to replace the stack (no back button).

Upvotes: 0

Related Questions