#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.