Nanji Mange
Nanji Mange

Reputation: 2265

How to manage(hide) Back Button and Master Page in navigation while Deeplinking?

On HomePage of Button Update Profile, it redirects and working fine. But when I try to go to Update Profile page from any other place like DeepLink, it shows Back Button with a word Master Page. Can anybody please suggest me what I am missing here?

enter image description here

HomePage(Master)

<?xml version="1.0" encoding="UTF-8"?>
<local:MasterDetailPageWithLifecycle xmlns="http://xamarin.com/schemas/2014/forms" 
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
         xmlns:local="clr-namespace:MyProject;assembly=MyProject"
         x:Class="MyProject.HomePage"
         OnAppearingCommand="{Binding OnAppearingCommand}"
         Title="Master Page">
    <MasterDetailPage.Master>
        <ContentPage Title="Home page" Icon="hamburger.png">
            <ContentPage.Resources>
                <ResourceDictionary>
                    <local:MenuItemDataTemplateSelector x:Key="menuItemDataTemplateSelector" HighlitedTemplate="{StaticResource highlitedTemplate}"
                                                        NormalTemplate="{StaticResource normalTemplate}" />
                </ResourceDictionary>
            </ContentPage.Resources>
            <StackLayout BackgroundColor="{DynamicResource d8Purple}" VerticalOptions="FillAndExpand" Padding="0, 48, 0, 0">
                <StackLayout Padding="0, 40, 0, 0" Spacing="0">
                    <ListView x:Name="listView" Margin="0,9,0,0" VerticalOptions="FillAndExpand" SeparatorVisibility="None"
                              ItemSelected="OnItemSelected" ItemTemplate="{StaticResource menuItemDataTemplateSelector}" />
                    </StackLayout>
                </StackLayout>
            </StackLayout>
        </ContentPage>
    </MasterDetailPage.Master>
</local:MasterDetailPageWithLifecycle>

HomePage.cs

public HomePage()
{
    InitializeComponent();
    BindingContext =_vm = App.Locator.Home;
    NavigationPage.SetHasNavigationBar(this, false);
    _masterPageItems = new List<MasterPageItem>();
    _masterPageItems.Add(new MasterPageItem
    {
        Title = "Update Profile",
        TargetType = nameof(EditProfilePage)
    });

    listView.ItemsSource = _masterPageItems;
}

public void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    var item = e.SelectedItem as MasterPageItem;
    if (item != null)
    {
        var name = item.TargetType;
        if (name == "EditProfilePage")
        {
            Detail = new MyProjectNavigationPage(new EditProfilePage());
            listView.SelectedItem = null;
            IsPresented = false;
        }
    }
}

public class MyProjectNavigationPage : NavigationPage
{
    public MyProjectNavigationPage(Page root) : base(root)
    {
        if (Device.OS == TargetPlatform.iOS)
        {
            BarTextColor = Colors.d8Grey;
            BarBackgroundColor = Color.White;
            Title = root.Title;
        }
    }
}

EditProfile XAML

<?xml version="1.0" encoding="UTF-8"?>
<local:ContentPageWithCustomBackButton
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:local="clr-namespace:MyProject;assembly=MyProject"
    x:Class="MyProject.EditProfilePage"
    OnAppearingCommand="{Binding OnAppearingCommand}"
    Title="Update Profile">
  <ContentPage.Content>
    <Grid RowSpacing="0">
      //Design content
    </Grid>
  </ContentPage.Content>
</local:ContentPageWithCustomBackButton>

EditProfile CS

public EditProfilePage()
{
    InitializeComponent();
    BindingContext=_editProfileViewModel = App.Locator.EditProfile;
    _editProfileViewModel.PropertyChanged += ViewModel_PropertyChanged;
}

EditProfileDeeplink

public override void Navigate(string uri)
{
    _navigationService.NavigateTo(nameof(EditProfilePage));
}

Upvotes: 0

Views: 643

Answers (2)

draco951
draco951

Reputation: 368

With presenters :

Create class for your presenter

public class IosPagePresenter : MvxFormsIosViewPresenter
{
    public override void Show(MvxViewModelRequest request)
    {
        if (request.PresentationValues?["NavigationCommand"] == "StackClear")
            FormsApplication.MainPage = new ContentPage();
        base.Show(request);
    }

    public IosPagePresenter(IUIApplicationDelegate applicationDelegate, UIWindow window, MvxFormsApplication formsApplication) : base(applicationDelegate, window, formsApplication)
    {
    }
}

Register this presenter in the setup.IOS

protected override IMvxIosViewPresenter CreatePresenter()
{
    var presenter = new IosPagePresenter(ApplicationDelegate, Window, FormsApplication);
    Mvx.RegisterSingleton<IMvxFormsViewPresenter>(presenter);
    return presenter;
}

And call from ViewModel

var bundle = new MvxBundle(new Dictionary<string, string> { { "NavigationCommand", "StackClear" } });
await _navigationService.Navigate<SavedTankViewModel>(bundle);

Upvotes: 0

Krunal Bagadia
Krunal Bagadia

Reputation: 419

It's just because of when your trying to Navigate from HomePage(Masterpage) to EditProfile Page you set EditProfile Page as Master Detaill Page Like,

        if (name == "EditProfilePage")
        {
            Detail = new MyProjectNavigationPage(new EditProfilePage());
            listView.SelectedItem = null;
            IsPresented = false;
        }

but when you Come from other page you Only Navigate to that Page Like,

_navigationService.NavigateTo(nameof(EditProfilePage));

So you have to handle this Navigation by set page as MasterDetail(DetailPage) Like,

App.Current.MainPage = new MenuMaster {Detail = new NavigationPage(new EditProfile())};

Upvotes: 1

Related Questions