【6月日新计划40】WPF入门-Prism之Navigation

259 阅读1分钟

參考21:可實現使用prism region,通過導航欄切換頁面

juejin.cn/post/725963…

1. INavigationAware

在 Prism 中,INavigationAware 接口用于在导航到新页面时执行特定操作。

这个接口应该由ViewModel来继承

    //导航到当前页面前
    public void OnNavigatedTo(NavigationContext navigationContext)
    {
        throw new NotImplementedException();
    }

    //是否创建新示例。为true的时候表示不创建新示例,页面还是之前的;如果为false,则创建新的页面。
    public bool IsNavigationTarget(NavigationContext navigationContext)
    {
        throw new NotImplementedException();
    }

    //导航离开当前页面前
    public void OnNavigatedFrom(NavigationContext navigationContext)
    {
        throw new NotImplementedException();
    }

2. IConfirmNavigationRequest

该接口继承自INavigationAware,所以,它多了一个功能:允许用户针对导航请求进行拦截。


    public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
    {
        throw new NotImplementedException();
    }

重寫方法


    public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
    {
        bool result = true;

        if (MessageBox.Show("Do you to navigate?", "Navigate?", MessageBoxButton.YesNo) == MessageBoxResult.No)
            result = false;
        
        //true则同意 false则拒绝
        continuationCallback(result);
    }

3. IRegionNavigationJournal

private  IRegionNavigationJournal journal;

public voiv Navigation(){

    regionManage.Regions["ModuleContent"].RequestNavigate(obj, navigationCallback =>
                {
                    if ((bool)navigationCallback.Result)
                    {
                        journal = navigationCallback.Context.NavigationService.Journal;
                    }
                }, pairs);
}
    public DelegateCommand BackCommand { get; private set; }
    public DelegateCommand NextCommand { get; private set; }

    public MainWindowViewModel(IRegionManager regionManager)
    {
        _regionManage = regionManager;
        OpenCommand = new DelegateCommand<string>(OpenMethod);
        BackCommand = new DelegateCommand(Back);
        NextCommand = new DelegateCommand(Next);
    }

    private void Back()
    {
        if (journal.CanGoBack)
        {
            journal.GoBack();
        }
    }