【问题标题】:Prism RequestNavigate does not work棱镜请求导航不起作用
【发布时间】:2018-03-04 19:09:13
【问题描述】:

在每个视图中

public partial class View2 : UserControl, IRegionMemberLifetime, INavigationAware
{

  public bool KeepAlive
  {
    get { return false; }
  }

  bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext)
  {
    return true;
  }
  void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext)
  {
    // Intentionally not implemented.
  }
  void INavigationAware.OnNavigatedTo(NavigationContext navigationContext)
  {
    this.navigationJournal = navigationContext.NavigationService.Journal;
  }

}

初始化:

container.RegisterType<object, View1>("View1");
container.RegisterType<object, View2>("View2");

regionManager.RequestNavigate("Window1", new Uri("View1", UriKind.Relative));
regionManager.RequestNavigate("Window2", new Uri("View2", UriKind.Relative));

我正在关注开发者指南,如果视图存在,它不会更改视图。

【问题讨论】:

  • 您不应该根据基本接口而不是object 类型注册您的类型吗?
  • 在开发者指南中是这样写的,我不知道是哪个基础接口,你是说IModule吗?
  • 您指的是哪个开发者指南?
  • 微软官方开发者指南

标签: wpf prism


【解决方案1】:

你确定视图被容器填充了吗?

我建议您为 RequestNavigate 方法提供回调,这样您就可以通过NavigationResult 跟踪您的视图发生的情况:

regionManager.RequestNavigate
(
    "Window1",
    new Uri("View2", UriKind.Relative),
    (NavigationResult nr) => 
    {
        var error = nr.Error;
        var result = nr.Result;
        // put a breakpoint here and checkout what NavigationResult contains
    }
);

【讨论】:

  • 7 年后,我想让我们为这个答案投票。很简单,帮助我轻松解决问题,然后我想我就是那个回答它的人......
【解决方案2】:

我已经看到,如果我实现 IConfirmNavigateRequest 并且不调用 continutationCallback(true),导航会悄悄地失败。

public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
    {
        //***Should have actual logic here
        continuationCallback(true);
    }

虽然这可能不是您的情况,但我通过调试 Prism 代码发现了这一点。我建议您这样做以解决您的问题。删除每个相关项目中对以下内容的引用。

  • Microsoft.Practices.Prism
  • Microsoft.Practices.Prism.Interactivity
  • Microsoft.Practices.Prism.MefExtensions
  • Microsoft.Practices.Prism.UnityExtensions

然后从 PrismLibrary DeskTop、Silverlight 或 Phone 目录(安装 PRISM 的位置)添加项目。然后引用这些项目。

【讨论】:

  • 谢谢!这正是我的问题,我只是浪费了一个小时。
【解决方案3】:

这是你的问题:

bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext) => true;

如果您希望每次调用RequestNavigate() 时都创建一个新视图并将其添加到您的区域,IsNavigationTarget() 必须返回 false 而不是 true。

【讨论】:

    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多