Prism RequestNavigate无法工作

7
在每个视图中
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类型? - Dan Puzey
2
在开发者指南中,它是这样写的,我不知道你指的是哪个基本接口,是指IModule吗? - viewer20q
你指的是哪个开发者指南? - Dan Puzey
微软官方开发者指南 - viewer20q
@Dan Puzey http://blogs.msdn.com/b/kashiffl/archive/2011/03/10/prism-4-region-navigation-with-silverlight-frame-navigation-and-unity.aspx - Shimmy Weitzhandler
在你的问题中,我找到了我的答案=)谢谢! - Vladislav
3个回答

18

你确定视图是由容器填充的吗?

我建议您为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
7年后,我正在考虑给这个答案点赞。它很简单,帮助我轻松解决了问题,然后我发现原来是我自己回答的... - Shimmy Weitzhandler

3

我发现如果我实现了IConfirmNavigateRequest接口,但没有调用continuationCallback(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桌面、Silverlight或Phone目录(您安装PRISM的位置)添加项目。然后引用这些项目。

谢谢!那正是我的问题,我刚刚浪费了一个小时。 - Golvellius

2
这是您的问题:
bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext) => true;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接