Prism之導航(Navigation)


一、注冊導航

1、注冊視圖或起別名

public class ModuleAProfile : IModule
    {
        public void OnInitialized(IContainerProvider containerProvider)
        {
        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<ViewA>();
            //注冊時指定ViewMode
            //containerRegistry.RegisterForNavigation<ViewA>("ViewAVM");
        }
    }

2、注冊時指定ViewMode並指定別名

public class ModuleAProfile : IModule
    {
        public void OnInitialized(IContainerProvider containerProvider)
        {
        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<ViewA,ViewAViewModel>();
            //注冊時指定ViewMode並指定別名
            //containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>("ViewAVM");
        }
    }

二、使用導航

IRegionManager regionManager = …;
regionManager.RequestNavigate("RegionName", "ViewName");

可以注意點, 我們調用了IRegionManager接口的RequestNavigate方法, 並且傳遞了兩個參數:

  • RegionName: 該參數為注冊的區域名稱
  • ViewName: 該參數實際為我們上面注冊過的導航頁, 字符串類型, 對應的是我們注冊頁面的nameof

三、帶參數導航

1、通過F12查看RequestNavigate,可以發現可以傳遞一個NavigationParameters進去,它是一個鍵值對的集合

image-20210817220754140

NavigationParameters pairs = new NavigationParameters();
            pairs.Add("Keys1", "Hello Prism!");
        _regionManage.Regions["ModuleContent"].RequestNavigate(obj,pairs);

2、接着在VM中繼承INavigationAware並實現

image-20210817221006492

3、在OnNavigatedTo方法中NavigationContext獲取到所傳遞的參數,通過屬性保存並綁定到視圖中

public void OnNavigatedTo(NavigationContext navigationContext)
        {
            if (navigationContext.Parameters.ContainsKey("Keys1"))
            {
                Content = navigationContext.Parameters.GetValue<string>("Keys1");
            }
            
        }
  • OnNavigatedTo: 導航完成前, 此處可以傳遞過來的參數以及是否允許導航等動作的控制。
  • IsNavigationTarget: 調用以確定此實例是否可以處理導航請求。否則新建實例
  • OnNavigatedFrom: 用於攔截導航,當導航離開當前頁時, 類似打開A, 再打開B時, 該方法被觸發。
INavigationAware 執行流程

img

攔截導航請求如果需要更多的功能則可以繼承IConfirmNavigationRequest,通過F12發現它派生於INavigationAware,並且有一個自己獨有的方法ConfirmNavigationRequest

image-20210817222921444

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

            if (MessageBox.Show("確認是否要離開當前模塊?","系統提示",MessageBoxButton.YesNo)==MessageBoxResult.No)
            {
                result = false;
            }

            continuationCallback(result);
        }

效果:

3

四、上一步/下一步

1、F12查看RequestNavigate,重載方法中有一個參數為Action

image-20210817224544524

我們稍微改一下

2、聲明一個IRegionNavigationJournal

 private  IRegionNavigationJournal journal;

3、在RequestNavigate中加一個Callback參數,獲取返回結果,通過這個navigationCallback的上下文中的導航服務獲取到Journal並賦值給剛聲明的IRegionNavigationJournal

regionManage.Regions["ModuleContent"].RequestNavigate(obj, navigationCallback =>
            {
                if ((bool)navigationCallback.Result)
                {
                    journal = navigationCallback.Context.NavigationService.Journal;
                }
            }, pairs);

4、創建兩個用於導航的按鈕命令

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

5、通過Journal即可調用導航

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

image-20210817225026070

效果:

4

示例代碼:https://github.com/luchong0813/PrismLearning


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM