05Prism WPF 入门实战 - Navigation
1.概要
源碼及PPT地址:https://github.com/JusterZhu/wemail
視頻地址:https://www.bilibili.com/video/BV1KQ4y1C7tg?share\source=copy\web
本章分為以下三個部分來了解:
Part1 視圖導航、參數傳遞
Part2 確認導航
Part3 導航日志
2.詳細內容
Part1 視圖導航、參數傳遞
當用戶與豐富的客戶端應用程序交互時,其用戶界面 (UI) 將不斷更新,以反映用戶正在處理的當前任務和數據。隨著時間的推移,隨著用戶與應用程序內的交互并完成各種任務,UI 可能會發生相當大的變化。應用程序協調這些 UI 更改的過程通常稱為導航,這一過程由INavigationAware做支撐。
應用場景:View之間傳值、需要在導航過程做操作(例如及時釋放資源)。
public class ContactViewModel : BindableBase , INavigationAware{private ObservableCollection<string> _contacts;private string _message;public string Message{get { return _message; }set { SetProperty(ref _message, value); }}public ObservableCollection<string> Contacts { get => _contacts ?? (_contacts = new ObservableCollection<string>()); }public ContactViewModel(){Message = "Wemail.Contact Prism Module";Contacts.Add("聯系人張某");Contacts.Add("聯系人王某");}public void OnNavigatedTo(NavigationContext navigationContext){var parameter = navigationContext.Parameters["Contact"];if (parameter == null) return;//導航到當前頁面前, 此處可以傳遞過來的參數以及是否允許導航等動作的控制Debug.WriteLine(parameter.ToString() + "To Contact View.");}public bool IsNavigationTarget(NavigationContext navigationContext){//根據業務需要調整該視圖,是否創建新示例。為true的時候表示不創建新實例,頁面還是之前的;return true;}public void OnNavigatedFrom(NavigationContext navigationContext){//導航離開當前頁面前。Debug.WriteLine("Leave Contact View.");}}Part2 確認導航
您經常會發現您需要在導航操作期間與用戶進行交互,以便用戶可以確認或取消它。例如,在許多應用程序中,用戶可能會嘗試在輸入或編輯數據時進行導航。在這些情況下,您可能需要詢問用戶是否希望保存或丟棄在繼續從頁面中導航之前已輸入的數據,或者用戶是否希望完全取消導航操作。這些特性由IConfirmNavigationRequest做支撐,它融入了AOP(面向切面編程)的思想。
應用場景:權限管理、檢測用戶行為(頁面停留多久、哪個模塊訪問次數最多等)、日志記錄等。
public class TempViewAViewModel : IConfirmNavigationRequest{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){//是否創建新示例。為true的時候表示不創建新示例,頁面還是之前的;如果為false,則創建新的頁面。return true;}public void OnNavigatedFrom(NavigationContext navigationContext){//導航離開當前頁面前。}public void OnNavigatedTo(NavigationContext navigationContext){//導航到當前頁面前, 此處可以傳遞過來的參數以及是否允許導航等動作的控制。}}Part3 導航日志
導航日志其實就是對導航系統的一個管理功能,理論上來說,我們應該知道我們上一步導航的位置、以及下一步導航的位置,包括我們導航的歷史記錄。以便于我們使用導航對應用程序可以靈活的控制。類似于我們熟知的雙向鏈表結構。導航日志由IRegionNavigationJournal提供支撐。
IRegionNavigationJournal接口有如下功能:
GoBack() : 返回上一頁
CanGoBack: 是否可以返回上一頁
GoForward(): 返回后一頁
CanGoForward: 是否可以返回后一頁
public class MainWindowViewModel : BindableBase{private string _title = "Prism Application";//Region管理對象private IRegionManager _regionManager;private IModuleCatalog _moduleCatalog;private ObservableCollection<IModuleInfo> _modules;private DelegateCommand _loadModulesCommand;private DelegateCommand _openViewA;private DelegateCommand _openViewB;private DelegateCommand _goBackView;private DelegateCommand _goForwardView;private IModuleInfo _moduleInfo;//導航日志private IRegionNavigationJournal _navigationJournal;public IView View { get; set; }public string Title{get { return _title; }set { SetProperty(ref _title, value); }}public ObservableCollection<IModuleInfo> Modules{get => _modules ?? (_modules = new ObservableCollection<IModuleInfo>());}public DelegateCommand LoadModulesCommand { get => _loadModulesCommand = new DelegateCommand(InitModules); }public IModuleInfo ModuleInfo { get {return _moduleInfo; }set {_moduleInfo = value;Navigate(value);}}public DelegateCommand OpenViewA { get => _openViewA ?? (_openViewA = new DelegateCommand(OpenViewAAction));}public DelegateCommand OpenViewB{get => _openViewB ?? (_openViewB = new DelegateCommand(OpenViewBAction)); }public DelegateCommand GoBackView { get => _goBackView ?? (_goBackView = new DelegateCommand(GoBackViewAction)); }public DelegateCommand GoForwardView { get => _goForwardView ?? (_goForwardView = new DelegateCommand(GoForwardViewAction)); }public MainWindowViewModel(IRegionManager regionManager, IModuleCatalog moduleCatalog){_regionManager = regionManager;_moduleCatalog = moduleCatalog;}private void OpenViewAAction(){//_regionManager.RequestNavigate("ContentRegion", "TempViewA");_regionManager.RequestNavigate("ContentRegion", "TempViewA",arg=> {//記錄導航日志上下文_navigationJournal = arg.Context.NavigationService.Journal;});}private void OpenViewBAction(){//_regionManager.RequestNavigate("ContentRegion", "TempViewB");_regionManager.RequestNavigate("ContentRegion", "TempViewB", arg =>{//記錄導航日志上下文_navigationJournal = arg.Context.NavigationService.Journal;});}/// <summary>/// 導航日志:導航到上一個/// </summary>private void GoBackViewAction(){if (_navigationJournal.CanGoBack){_navigationJournal.GoBack();}}/// <summary>/// 導航日志:導航到下一個/// </summary>private void GoForwardViewAction(){if (_navigationJournal.CanGoForward){_navigationJournal.GoForward();}}public void InitModules() {var dirModuleCatalog = _moduleCatalog as DirectoryModuleCatalog;Modules.AddRange(dirModuleCatalog.Modules);}private void Navigate(IModuleInfo info) {var paramete = new NavigationParameters();//任意定義key,value。導航到的視圖按照約定key獲取value即可。paramete.Add($"{ info.ModuleName }", DateTime.Now.ToString());_regionManager.RequestNavigate("ContentRegion", $"{ info.ModuleName }View", paramete);}}總結
以上是生活随笔為你收集整理的05Prism WPF 入门实战 - Navigation的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【v3.6.2】iNeuOS工业互联网操
- 下一篇: 持续集成、持续交付(CI/CD)开篇,先