2016-12-13 75 views
0

我有一个我编写的MVVM Xamarin Forms框架,我试图建立如何在弹出模式对话框时为Soft Navigate Back按钮(在iOS中用于此问题)重写BackButtonText。在Xamarin Forms中显示模态对话框时如何显示和设置'BackButtonText'?

我的导航服务创建其又被经由IoC容器变成NavigationPage像这样的自定义模态页面控制器视图模型:

public async Task PushModalAsync<T>() where T : INavigationPageModel 
    { 
     var navigationmodel = _viewModelFactory.CreateModel<ModalPageControllerViewModel<T>>(); 
     var page = _viewFactory.CreatePage(navigationmodel); 
     await Navigation.PushModalAsync(page); 
    } 

所得页结束了与类结构:

public class NavigationControllerView : NavigationPage, IView 

然后让我设置我自己的ViewModel的BindingContext。之后,我希望有约束力为我做其余的重担。在此导航控制器视图上设置绑定上下文将我的第一页(本例中为模态对话框的唯一页面)推送到导航堆栈上。

var page = _viewFactory.CreatePage(_viewModel.CurrentPage); 
PushAsync(page); 

页面,然后正确地显示我的设备上的弹出页面显示我的导航栏,并在显示的工具栏的项目,如我期望。所有的绑定似乎都按我想象的那样工作,我可以从ViewModel中解散页面。迄今为止都很好。

现在(我在这里猜测),因为模态对话框是模态堆栈中的唯一页面,可能是因为它是模态,所以这个模态页面没有出现“返回”按钮。我想要做的是在模式弹出窗口上显示“返回”按钮并覆盖其文本,以便显示“取消”。这应该看起来像iOS中的“创建新邮件”弹出页面的想法,所以我可以解雇它。这表明它

我看了好几篇文章应为“简单”配股代码

NavigationPage.SetBackButtonText(page, "Some title") 

,甚至包括行

NavigationPage.SetHasBackButton(page, this) 

但忽视告诉我到底这需要发生。有人认为这应该发生在页面的构造函数中,但是什么页面?它是导航页面本身的页面(据我所知它是托管的模式页面的包装)。

注:我已经在NavigationPage中托管了Modal页面,以便继续显示导航栏和工具栏项目。

我试过把NavigationPage.SetBackButtonText和NavigationPage.SetHasBackButton放在所有的地方,但他们都没有做任何事情。

阅读另一篇文章表明,这些方法只影响'下一个'页面,因此我试图在显示之前将相同的方法应用到上一页,但仍然没有成功。但是实际上,我们没有前一页作为模式弹出窗口,并且是堆栈中唯一的东西。

任何想法,我可能会在这里出错?

回答

0

所以这里的问题看起来像是你想在你的模态导航页面显示一个后退按钮,但是导航页面的栈没有任何东西可以返回。

您可以尝试在模态导航页面的堆栈中放置一个“虚拟”页面,然后您会看到一个后退按钮,并可能更改文本以显示“取消”。这种方法需要一些额外的接线来处理后退导航,并且当您将“取消”返回到虚拟页面时,可能会弹出模态栈的模态导航。

声明:我还没有尝试过这种方法,不知道会出现什么其他问题。