Prism RequestNavigate не работает

#wpf #prism

#wpf #prism

Вопрос:

В каждом представлении

 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));
  

Я следую руководству разработчика, оно не изменяет представление, если представление существует.

Комментарии:

1. Разве вы не должны регистрировать свои типы в базовых интерфейсах, а не в object типе?

2. в руководстве разработчика это написано таким образом, я не знаю, какой базовый интерфейс, вы имеете в виду IModule?

3. На какое руководство разработчика вы ссылаетесь?

4. Официальное руководство разработчика Microsft

5. @Дэн Пузей blogs.msdn.com/b/kashiffl/archive/2011/03/10 /…

Ответ №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
    }
);
  

Комментарии:

1. Спустя 7 лет, и я думаю, давайте поддержим этот ответ. Это было просто и помогло мне легко решить проблему, тогда я полагаю, что я тот, кто ответил на нее…

Ответ №2:

Я видел, что если я реализую IConfirmNavigateRequest и не вызываю continutationCallback (true), навигация завершается без сбоев.

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

Хотя это может быть не в вашем случае, я выяснил это путем отладки с помощью кода Prism. Я бы посоветовал вам сделать это, чтобы выяснить вашу проблему. Удалите ссылки на следующие в каждом соответствующем проекте.

  • Майкрософт.Практика.Prism
  • Майкрософт.Практика.Призма.Интерактивность
  • Майкрософт.Практика.Prism.MefExtensions
  • Майкрософт.Практика.Призма.UnityExtensions

Затем добавьте проекты из PrismLibrary DeskTop, Silverlight или телефонного каталога (где вы установили PRISM). Затем обратитесь к этим проектам.

Комментарии:

1. Спасибо! Это была именно моя проблема, на решение которой я потратил час.

Ответ №3:

Это ваша проблема:

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

Если вы хотите, чтобы при каждом вызове создавалось новое представление и добавлялось в ваш регион, RequestNavigate() оно IsNavigationTarget() должно возвращать false вместо true.