确认导航
你会经常发现在导航操作过程中需要与用户进行交互,以便用户可以进行确认或取消。例如在许多应用程序中用户可能会在输入或编辑数据的过程中试图进行导航。在这些情况下,您可能想询问用户是否要在继续导航离开页面之前保存或放弃已经输入的数据,或者用户是否希望完全取消导航操作。Prism通过IConfirmNavigationRequest接口支持这些场景。
IConfirmNavigationRequest接口派生自INavigationAware接口,并添加了ConfirmNavigationRequest方法。通过在视图或视图模型类上实现此接口,允许它们以与用户交互的方式参与导航序列,从而便于用户可以确认或取消导航。显示确认的一种方法是使用简单的Windows消息框。对于更复杂的内容,可以使用对话框服务中描述的Dialog Service。
ConfirmNavigationRequest方法提供两个参数,一个是对前面所述的当前导航上下文的引用,另一个是当您希望继续导航时可以调用的回调方法。
以下步骤总结了使用InteractionRequest对象确认导航的过程:
- 导航操作是通过RequestNavigate方法调用启动的。
- 如果当前视图的视图或视图模型实现了IConfirmNavigation,则会调用ConfirmNavigationRequest。
- 视图显示确认UI并等待用户的响应。
- 调用Continuation回调以继续或取消挂起的导航操作。
- 导航操作完成或取消。
为了说明这一点,请查看22-ConfirmCancelNavigation中的示例应用程序。
public class ViewAViewModel : BindableBase, IConfirmNavigationRequest
{
public ViewAViewModel()
{
}
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
bool result = true;
// this is demo code only and not suitable for production. It is generally
// poor practice to reference your UI in the view model. Use the Prism
// IDialogService to help with this.
if (MessageBox.Show("Do you to navigate?", "Navigate?", MessageBoxButton.YesNo) == MessageBoxResult.No)
result = false;
continuationCallback(result);
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
}
}
在上面的例子中,当调用ConfirmNavigationRequest时,会弹出一个简单的windows消息框让用户选择Yes或No。如果用户选择了“No”按钮,那么导航将被取消。
所有这些都发生在UI线程上。但是仍然可以调用异步方法(例如REST API调用)来帮助确定导航状态。在这种情况下,根据实现的不同你可能需要存储对回调函数的引用,以便在其他位置调用它。
如果有一个长时间运行的实例实现,用户可能会调用另一个导航操作。如果发生这种情况,前一个导航将会被取消,并且为前一个导航的调用回调将会无效,因为它不再是当前导航。