Deeplinking时如何在导航中管理(隐藏)后退按钮和母版页?

时间:2018-04-10 09:51:03

标签: xamarin.forms xamarin.ios navigation

在按钮HomePage的{​​{1}}上,它会重定向并正常工作。但是,当我尝试从DeepLink等任何其他位置转到Update Profile页面时,它会显示Update Profile一个单词Back Button。任何人都可以建议我在这里缺少什么?

enter image description here

主页(主)

Master Page

HomePage.cs

<?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>

EditProfile XAML

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 CS

<?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>

EditProfileDeeplink

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

2 个答案:

答案 0 :(得分:1)

这只是因为您尝试导航主页(母版页) EditProfile 页面时设置 EditProfile Page as Master Detaill Page 赞,

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

但是当你来自其他网页时,你只有导航到该页面,

_navigationService.NavigateTo(nameof(EditProfilePage));

所以你必须通过设置页面来处理这个导航为 MasterDetail(DetailPage)喜欢,

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

答案 1 :(得分:0)

与主持人:

为演示者创建课程

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)
    {
    }
}

在setup.IOS中注册此演示者

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

然后从ViewModel调用

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