Prism导航
  fcV4LIjjtd23 2023年11月02日 44 0

通常,导航意味着某个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

image

引用

  1. Prism Library: Navigation Using the Prism Library
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  NPQODODLqddb   2024年05月17日   70   0   0 .NET
  mVIyUuLhKsxa   2024年05月17日   53   0   0 .NET
  XkHDHG7Y62UM   2024年05月17日   45   0   0 .NET
  f18CFixvrKz8   2024年05月18日   88   0   0 .NET
  rBgzkhl6abbw   2024年05月18日   78   0   0 .NET
  MYrYhn3ObP4r   2024年05月17日   41   0   0 .NET
  S34pIcuyyIVd   2024年05月17日   60   0   0 .NET
  gKJ2xtp6I8Y7   2024年05月17日   50   0   0 .NET
  MYrYhn3ObP4r   2024年05月17日   40   0   0 .NET
fcV4LIjjtd23