Prism導航

2023-06-26 09:00:34

通常,導航意味著某個Control被新增到UI中,與此同時另一個Control被移除。

簡單跳轉

  1. 新建 UserControl,新建ViewModel,VM需要實現 INavigationAware

  2. 註冊 UserControl到DryIoc容器

containerRegistry.RegisterForNavigation<IndexView, IndexViewModel>();
  1. 在XAML中需要導航的地方宣告Region
<ContentControl prism:RegionManager.RegionName="ContentRegion" />
  1. 在需要導航的地方(VM或後置程式碼中)注入 IRegionManager 並請求導航(關於 Prism 中的Region 可見我的另一篇隨筆
public DelegateCommand<string> NavigateCommand { get; private set; }

public MainWindowViewModel(IRegionManager regionManager)
{
    _regionManager = regionManager;

    NavigateCommand = new DelegateCommand<string>(Navigate);
}

private void Navigate(string navigatePath)
{
    if (navigatePath != null)
        _regionManager.RequestNavigate("ContentRegion", navigatePath);
}

導航後執行回撥

請求導航時可以新增一個回撥方法用於導航成功後被使用

void RequestNavigate(
    string regionName,
    string source,
    Action<NavigationResult> navigationCallback
);

一個例子:

private void Navigate(string navigatePath)
{
    if (navigatePath != null)
    _regionManager.RequestNavigate("ContentRegion", navigatePath, NavigationComplete);
}

private void NavigationComplete(NavigationResult result)
{
    System.Windows.MessageBox.Show(String.Format("Navigation to {0} complete. ", result.Context.Uri));
}

被導航檢視的複用

每個能夠被導航的檢視的VM都需要實現 INavigationAware 介面,介面中有一個 IsNavigationTarget 方法,它用於表明當前檢視是否可以被導航複用,如果直接返回 true,那麼導航時將總是使用同一個範例。

也可以根據條件返回 false 以使用新的VM範例。

被導航檢視的生命週期

當導航到新的檢視之後, 之前的檢視就成了deactive狀態。

可以通過實現 IRegionMemberLifetime 並重寫 KeepAliveget 方法來自定義什麼情況下銷燬頁面,使每次頁面處於 deactivated 狀態時 ViewModel 物件被銷燬,再次導航到被銷燬頁面後重新建立新 ViewModel 物件。

public class ViewBViewModel : BindableBase, INavigationAware, IRegionMemberLifetime
{
    public bool KeepAlive => false;
// ...

導航時攜帶引數

private void PersonSelected(Person person)
{
    var parameters = new NavigationParameters();
    parameters.Add("person", person);

    if (person != null)
        _regionManager.RequestNavigate("PersonDetailsRegion", "PersonDetail", parameters);
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
    var person = navigationContext.Parameters["person"] as Person;
    if (person != null)
        SelectedPerson = person;
}

TabControl與Prism導航

TabControl 中宣告 RegionName ,在導航時會自動新增 TabPage

參照

  1. Prism Library: Navigation Using the Prism Library